logster 1.3.1 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +18 -18
  3. data/.travis.yml +15 -15
  4. data/CHANGELOG.md +140 -137
  5. data/Gemfile +4 -4
  6. data/Guardfile +8 -8
  7. data/LICENSE.txt +22 -22
  8. data/README.md +99 -99
  9. data/Rakefile +24 -24
  10. data/assets/fonts/FontAwesome.otf +0 -0
  11. data/assets/fonts/fontawesome-webfont.eot +0 -0
  12. data/assets/fonts/fontawesome-webfont.svg +639 -639
  13. data/assets/fonts/fontawesome-webfont.ttf +0 -0
  14. data/assets/fonts/fontawesome-webfont.woff +0 -0
  15. data/assets/fonts/fontawesome-webfont.woff2 +0 -0
  16. data/assets/images/Icon-144_rounded.png +0 -0
  17. data/assets/images/Icon-144_square.png +0 -0
  18. data/assets/images/icon_144x144.png +0 -0
  19. data/assets/images/icon_64x64.png +0 -0
  20. data/assets/javascript/client-app.js +92 -81
  21. data/assets/stylesheets/client-app.css +1 -1
  22. data/build_client_app.sh +0 -0
  23. data/client-app/.editorconfig +20 -20
  24. data/client-app/.ember-cli +9 -9
  25. data/client-app/.eslintignore +19 -19
  26. data/client-app/.eslintrc.js +46 -46
  27. data/client-app/.gitignore +23 -23
  28. data/client-app/.travis.yml +27 -27
  29. data/client-app/.watchmanconfig +3 -3
  30. data/client-app/README.md +57 -57
  31. data/client-app/app/app.js +14 -14
  32. data/client-app/app/components/actions-menu.js +37 -0
  33. data/client-app/app/components/message-info.js +65 -18
  34. data/client-app/app/components/message-row.js +45 -45
  35. data/client-app/app/components/panel-resizer.js +75 -75
  36. data/client-app/app/components/tab-contents.js +27 -27
  37. data/client-app/app/components/tab-link.js +5 -5
  38. data/client-app/app/components/tabbed-section.js +32 -32
  39. data/client-app/app/components/time-formatter.js +25 -25
  40. data/client-app/app/components/update-time.js +21 -21
  41. data/client-app/app/controllers/index.js +92 -83
  42. data/client-app/app/controllers/show.js +13 -13
  43. data/client-app/app/index.html +29 -29
  44. data/client-app/app/initializers/app-init.js +72 -55
  45. data/client-app/app/lib/preload.js +14 -14
  46. data/client-app/app/lib/utilities.js +140 -140
  47. data/client-app/app/models/message-collection.js +158 -158
  48. data/client-app/app/models/message.js +99 -99
  49. data/client-app/app/resolver.js +3 -3
  50. data/client-app/app/router.js +14 -14
  51. data/client-app/app/routes/index.js +57 -53
  52. data/client-app/app/routes/show.js +14 -14
  53. data/client-app/app/styles/app.css +497 -387
  54. data/client-app/app/templates/application.hbs +2 -2
  55. data/client-app/app/templates/components/actions-menu.hbs +12 -0
  56. data/client-app/app/templates/components/message-info.hbs +41 -44
  57. data/client-app/app/templates/components/message-row.hbs +17 -17
  58. data/client-app/app/templates/components/panel-resizer.hbs +3 -0
  59. data/client-app/app/templates/components/tabbed-section.hbs +10 -10
  60. data/client-app/app/templates/components/time-formatter.hbs +1 -1
  61. data/client-app/app/templates/index.hbs +65 -57
  62. data/client-app/app/templates/show.hbs +7 -4
  63. data/client-app/config/environment.js +51 -51
  64. data/client-app/config/optional-features.json +3 -3
  65. data/client-app/config/targets.js +18 -18
  66. data/client-app/ember-cli-build.js +29 -29
  67. data/client-app/package-lock.json +11365 -11365
  68. data/client-app/package.json +56 -56
  69. data/client-app/testem.js +25 -25
  70. data/client-app/tests/index.html +34 -34
  71. data/client-app/tests/integration/components/actions-menu-test.js +26 -0
  72. data/client-app/tests/integration/components/message-info-test.js +26 -26
  73. data/client-app/tests/integration/components/message-row-test.js +26 -26
  74. data/client-app/tests/integration/components/panel-resizer-test.js +26 -26
  75. data/client-app/tests/integration/components/tab-contents-test.js +26 -26
  76. data/client-app/tests/integration/components/tab-link-test.js +26 -26
  77. data/client-app/tests/integration/components/tabbed-section-test.js +26 -26
  78. data/client-app/tests/integration/components/time-formatter-test.js +26 -26
  79. data/client-app/tests/integration/components/update-time-test.js +26 -26
  80. data/client-app/tests/test-helper.js +8 -8
  81. data/client-app/tests/unit/controllers/index-test.js +12 -12
  82. data/client-app/tests/unit/controllers/show-test.js +12 -12
  83. data/client-app/tests/unit/initializers/app-init-test.js +31 -31
  84. data/client-app/tests/unit/routes/index-test.js +11 -11
  85. data/client-app/tests/unit/routes/show-test.js +11 -11
  86. data/lib/examples/sidekiq_logster_reporter.rb +21 -21
  87. data/lib/logster.rb +54 -54
  88. data/lib/logster/base_store.rb +130 -130
  89. data/lib/logster/configuration.rb +25 -25
  90. data/lib/logster/ignore_pattern.rb +65 -65
  91. data/lib/logster/logger.rb +108 -108
  92. data/lib/logster/message.rb +227 -227
  93. data/lib/logster/middleware/debug_exceptions.rb +26 -26
  94. data/lib/logster/middleware/reporter.rb +56 -56
  95. data/lib/logster/middleware/viewer.rb +221 -220
  96. data/lib/logster/rails/railtie.rb +58 -58
  97. data/lib/logster/redis_store.rb +481 -481
  98. data/lib/logster/version.rb +3 -3
  99. data/lib/logster/web.rb +14 -14
  100. data/logster.gemspec +34 -34
  101. data/test/examples/test_sidekiq_reporter_example.rb +46 -46
  102. data/test/fake_data/Gemfile +4 -4
  103. data/test/fake_data/generate.rb +10 -10
  104. data/test/logster/middleware/test_reporter.rb +21 -21
  105. data/test/logster/middleware/test_viewer.rb +96 -96
  106. data/test/logster/test_base_store.rb +147 -147
  107. data/test/logster/test_ignore_pattern.rb +41 -41
  108. data/test/logster/test_logger.rb +80 -80
  109. data/test/logster/test_message.rb +34 -34
  110. data/test/logster/test_redis_rate_limiter.rb +230 -230
  111. data/test/logster/test_redis_store.rb +427 -427
  112. data/test/test_helper.rb +38 -38
  113. data/vendor/assets/javascripts/logster.js.erb +39 -39
  114. metadata +6 -2
@@ -1,99 +1,99 @@
1
- import { ajax, buildHashString } from "client-app/lib/utilities";
2
- import Preload from "client-app/lib/preload";
3
- import { computed } from "@ember/object";
4
-
5
- export default Em.Object.extend({
6
- MAX_LEN: 200,
7
-
8
- expand() {
9
- this.set("expanded", true);
10
- },
11
-
12
- solve() {
13
- return ajax("/solve/" + this.get("key"), { type: "PUT" });
14
- },
15
-
16
- destroy() {
17
- return ajax("/message/" + this.get("key"), { type: "DELETE" });
18
- },
19
-
20
- protect() {
21
- this.set("protected", true);
22
- return ajax("/protect/" + this.get("key"), { type: "PUT" });
23
- },
24
- unprotect() {
25
- this.set("protected", false);
26
- return ajax("/unprotect/" + this.get("key"), { type: "DELETE" });
27
- },
28
-
29
- showCount: computed("count", function() {
30
- return this.get("count") > 1;
31
- }),
32
-
33
- hasMore: computed("message", "expanded", function() {
34
- const message = this.get("message");
35
- const expanded = this.get("expanded");
36
-
37
- return !expanded && message.length > this.MAX_LEN;
38
- }),
39
-
40
- shareUrl: computed("key", function() {
41
- return Preload.get("rootPath") + "/show/" + this.get("key");
42
- }),
43
-
44
- displayMessage: computed("message", "expanded", function() {
45
- let message = this.get("message");
46
- const expanded = this.get("expanded");
47
-
48
- if (!expanded && message.length > this.MAX_LEN) {
49
- message = message.substr(0, this.MAX_LEN);
50
- }
51
- return message;
52
- }),
53
-
54
- updateFromObject(other) {
55
- // XXX Only updatable property is count right now
56
- this.set("count", other.get("count"));
57
- },
58
-
59
- canSolve: computed(function() {
60
- const backtrace = this.get("backtrace");
61
- return (
62
- this.get("env.application_version") && backtrace && backtrace.length > 0
63
- );
64
- }),
65
-
66
- envTable: computed("env", function() {
67
- return buildHashString(this.get("env"));
68
- }),
69
-
70
- rowClass: computed("severity", function() {
71
- switch (this.get("severity")) {
72
- case 0:
73
- return "debug";
74
- case 1:
75
- return "info";
76
- case 2:
77
- return "warn";
78
- case 3:
79
- return "error";
80
- case 4:
81
- return "fatal";
82
- }
83
- }),
84
-
85
- glyph: computed("severity", function() {
86
- switch (this.get("severity")) {
87
- case 0:
88
- return "";
89
- case 1:
90
- return "";
91
- case 2:
92
- return "<i class='fa fa-exclamation-circle warning'></i>";
93
- case 3:
94
- return "<i class='fa fa-times-circle error'></i>";
95
- case 4:
96
- return "<i class='fa fa-times-circle fatal'></i>";
97
- }
98
- })
99
- });
1
+ import { ajax, buildHashString } from "client-app/lib/utilities";
2
+ import Preload from "client-app/lib/preload";
3
+ import { computed } from "@ember/object";
4
+
5
+ export default Em.Object.extend({
6
+ MAX_LEN: 200,
7
+
8
+ expand() {
9
+ this.set("expanded", true);
10
+ },
11
+
12
+ solve() {
13
+ return ajax("/solve/" + this.get("key"), { type: "PUT" });
14
+ },
15
+
16
+ destroy() {
17
+ return ajax("/message/" + this.get("key"), { type: "DELETE" });
18
+ },
19
+
20
+ protect() {
21
+ this.set("protected", true);
22
+ return ajax("/protect/" + this.get("key"), { type: "PUT" });
23
+ },
24
+ unprotect() {
25
+ this.set("protected", false);
26
+ return ajax("/unprotect/" + this.get("key"), { type: "DELETE" });
27
+ },
28
+
29
+ showCount: computed("count", function() {
30
+ return this.get("count") > 1;
31
+ }),
32
+
33
+ hasMore: computed("message", "expanded", function() {
34
+ const message = this.get("message");
35
+ const expanded = this.get("expanded");
36
+
37
+ return !expanded && message.length > this.MAX_LEN;
38
+ }),
39
+
40
+ shareUrl: computed("key", function() {
41
+ return Preload.get("rootPath") + "/show/" + this.get("key");
42
+ }),
43
+
44
+ displayMessage: computed("message", "expanded", function() {
45
+ let message = this.get("message");
46
+ const expanded = this.get("expanded");
47
+
48
+ if (!expanded && message.length > this.MAX_LEN) {
49
+ message = message.substr(0, this.MAX_LEN);
50
+ }
51
+ return message;
52
+ }),
53
+
54
+ updateFromObject(other) {
55
+ // XXX Only updatable property is count right now
56
+ this.set("count", other.get("count"));
57
+ },
58
+
59
+ canSolve: computed(function() {
60
+ const backtrace = this.get("backtrace");
61
+ return (
62
+ this.get("env.application_version") && backtrace && backtrace.length > 0
63
+ );
64
+ }),
65
+
66
+ envTable: computed("env", function() {
67
+ return buildHashString(this.get("env"));
68
+ }),
69
+
70
+ rowClass: computed("severity", function() {
71
+ switch (this.get("severity")) {
72
+ case 0:
73
+ return "debug";
74
+ case 1:
75
+ return "info";
76
+ case 2:
77
+ return "warn";
78
+ case 3:
79
+ return "error";
80
+ case 4:
81
+ return "fatal";
82
+ }
83
+ }),
84
+
85
+ glyph: computed("severity", function() {
86
+ switch (this.get("severity")) {
87
+ case 0:
88
+ return "";
89
+ case 1:
90
+ return "";
91
+ case 2:
92
+ return "<i class='fa fa-exclamation-circle warning'></i>";
93
+ case 3:
94
+ return "<i class='fa fa-times-circle error'></i>";
95
+ case 4:
96
+ return "<i class='fa fa-times-circle fatal'></i>";
97
+ }
98
+ })
99
+ });
@@ -1,3 +1,3 @@
1
- import Resolver from 'ember-resolver';
2
-
3
- export default Resolver;
1
+ import Resolver from "ember-resolver";
2
+
3
+ export default Resolver;
@@ -1,14 +1,14 @@
1
- import EmberRouter from '@ember/routing/router';
2
- import config from './config/environment';
3
-
4
- const Router = EmberRouter.extend({
5
- location: config.locationType,
6
- rootURL: config.rootURL
7
- });
8
-
9
- Router.map(function() {
10
- this.route("index", { path: "/" });
11
- this.route("show", { path: "/show/:id" });
12
- });
13
-
14
- export default Router;
1
+ import EmberRouter from "@ember/routing/router";
2
+ import config from "./config/environment";
3
+
4
+ const Router = EmberRouter.extend({
5
+ location: config.locationType,
6
+ rootURL: config.rootURL
7
+ });
8
+
9
+ Router.map(function() {
10
+ this.route("index", { path: "/" });
11
+ this.route("show", { path: "/show/:id" });
12
+ });
13
+
14
+ export default Router;
@@ -1,53 +1,57 @@
1
- import Route from "@ember/routing/route";
2
- import MessageCollection from "client-app/models/message-collection";
3
- import { isHidden } from "client-app/lib/utilities";
4
-
5
- export default Route.extend({
6
- model() {
7
- // TODO from preload json?
8
- return MessageCollection.create();
9
- },
10
-
11
- setupController(controller, model) {
12
- this._super(controller, model);
13
- controller.setProperties({
14
- showDebug: true,
15
- showInfo: true,
16
- showWarn: true,
17
- showErr: true,
18
- showFatal: true,
19
- search: "",
20
- initialized: true
21
- });
22
- model.reload();
23
-
24
- let times = 0;
25
- let backoff = 1;
26
-
27
- this.refreshInterval = setInterval(() => {
28
- times += 1;
29
- const hidden = isHidden();
30
- let load = !hidden;
31
-
32
- if (hidden) {
33
- if (times % backoff === 0) {
34
- load = true;
35
- if (backoff < 20) {
36
- backoff++;
37
- }
38
- }
39
- }
40
- // refresh a lot less aggressively in background
41
- if (load) {
42
- model.loadMore();
43
- if (!hidden) {
44
- backoff = 1;
45
- }
46
- }
47
- }, 3000);
48
- },
49
-
50
- deactivate() {
51
- clearInterval(this.refreshInterval);
52
- }
53
- });
1
+ import Route from "@ember/routing/route";
2
+ import MessageCollection from "client-app/models/message-collection";
3
+ import { isHidden } from "client-app/lib/utilities";
4
+
5
+ export default Route.extend({
6
+ model() {
7
+ // TODO from preload json?
8
+ return MessageCollection.create();
9
+ },
10
+
11
+ setupController(controller, model) {
12
+ this._super(controller, model);
13
+ controller.setProperties({
14
+ showDebug: true,
15
+ showInfo: true,
16
+ showWarn: true,
17
+ showErr: true,
18
+ showFatal: true,
19
+ search: "",
20
+ initialized: true
21
+ });
22
+ model.reload();
23
+
24
+ let times = 0;
25
+ let backoff = 1;
26
+
27
+ this.refreshInterval = setInterval(() => {
28
+ times += 1;
29
+ const hidden = isHidden();
30
+ let load = !hidden;
31
+
32
+ if (hidden) {
33
+ if (times % backoff === 0) {
34
+ load = true;
35
+ if (backoff < 20) {
36
+ backoff++;
37
+ }
38
+ }
39
+ }
40
+ // refresh a lot less aggressively in background
41
+ if (load) {
42
+ model.loadMore();
43
+ if (!hidden) {
44
+ backoff = 1;
45
+ }
46
+ }
47
+ }, 3000);
48
+
49
+ this.events.on("panelResized", amount => {
50
+ controller.resizePanels(amount);
51
+ });
52
+ },
53
+
54
+ deactivate() {
55
+ clearInterval(this.refreshInterval);
56
+ }
57
+ });
@@ -1,14 +1,14 @@
1
- import Route from "@ember/routing/route";
2
- import Message from "client-app/models/message";
3
- import { preloadOrAjax } from "client-app/lib/utilities";
4
-
5
- export default Route.extend({
6
- model(params) {
7
- return preloadOrAjax("/show/" + params.id + ".json");
8
- },
9
-
10
- setupController(controller, model) {
11
- this._super(...arguments);
12
- controller.set("model", Message.create(model));
13
- }
14
- });
1
+ import Route from "@ember/routing/route";
2
+ import Message from "client-app/models/message";
3
+ import { preloadOrAjax } from "client-app/lib/utilities";
4
+
5
+ export default Route.extend({
6
+ model(params) {
7
+ return preloadOrAjax("/show/" + params.id + ".json");
8
+ },
9
+
10
+ setupController(controller, model) {
11
+ this._super(...arguments);
12
+ controller.set("model", Message.create(model));
13
+ }
14
+ });
@@ -1,387 +1,497 @@
1
- body {
2
- font-family: "Roboto", Arial, "Liberation Sans", "DejaVu Sans", sans-serif;
3
- font-size: 12px;
4
- }
5
-
6
- pre {
7
- font-family: "Roboto Mono", Consolas, Monaco, Ubuntu Mono, monospace;
8
- }
9
-
10
- table.env-table tbody tr td {
11
- border-top: none;
12
- line-height: 18px;
13
- vertical-align: top;
14
- }
15
-
16
- table.env-table,
17
- table.env-table table {
18
- border-spacing: 0;
19
- border-collapse: collapse;
20
- }
21
-
22
- table.env-table td {
23
- padding-right: 5px;
24
- }
25
-
26
- tbody tr {
27
- width: 98%;
28
- }
29
-
30
- tbody tr td {
31
- border-top: 1px #e9e9e9 solid;
32
- line-height: 25px;
33
- }
34
-
35
- .message-row:hover {
36
- background-color: #f8f8f8;
37
- cursor: pointer;
38
- }
39
-
40
- .message-row.selected {
41
- background-color: #dfdfdf;
42
- }
43
-
44
- th {
45
- text-align: left;
46
- padding-right: 10px;
47
- font-size: 12px;
48
- color: #222;
49
- padding-bottom: 8px;
50
- }
51
-
52
- td.time {
53
- font-size: 12px;
54
- color: #999;
55
- vertical-align: top;
56
- }
57
- .message {
58
- font-size: 13px;
59
- overflow: hidden;
60
- white-space: nowrap;
61
- text-overflow: ellipsis;
62
- padding-right: 10px;
63
- }
64
-
65
- th.count {
66
- width: 20px;
67
- }
68
-
69
- th.severity {
70
- width: 15px;
71
- }
72
-
73
- th.time {
74
- width: 90px;
75
- text-align: right;
76
- padding-right: 20px;
77
- }
78
-
79
- td.time {
80
- text-align: right;
81
- padding-right: 8px;
82
- }
83
-
84
- th.protected {
85
- width: 10px;
86
- }
87
-
88
- i.fatal {
89
- color: #e00;
90
- }
91
-
92
- i.error {
93
- color: #900;
94
- }
95
-
96
- i.warning {
97
- color: #feb800;
98
- }
99
-
100
- .debug {
101
- color: #777;
102
- }
103
-
104
- td.count {
105
- text-align: right;
106
- padding-right: 4px;
107
- }
108
-
109
- .count span {
110
- font-size: 11px;
111
- font-weight: bold;
112
- }
113
-
114
- .action-panel .search input {
115
- border: 1px solid #ddd;
116
- padding: 3px;
117
- vertical-align: middle;
118
- }
119
-
120
- .regex input {
121
- margin-left: 2px !important;
122
- }
123
-
124
- tr.show-more {
125
- text-align: center;
126
- height: 30px;
127
- text-decoration: none;
128
- background-color: #ddd;
129
- cursor: pointer;
130
- font-size: 12px;
131
- }
132
-
133
- #bottom-panel {
134
- position: fixed;
135
- bottom: 0;
136
- left: 0;
137
- right: 100%;
138
- height: 300px;
139
- width: 100%;
140
- background-color: #f1f1f1;
141
- padding: 8px;
142
- font-size: 12px;
143
- }
144
-
145
- #bottom-panel.full {
146
- position: static;
147
- background-color: inherit;
148
- height: 90%;
149
- }
150
-
151
- #bottom-panel.full > div {
152
- padding-bottom: 40px;
153
- }
154
- #bottom-panel.full .tabs {
155
- display: none;
156
- }
157
-
158
- #bottom-panel.full .message-info {
159
- position: static;
160
- }
161
-
162
- #bottom-panel.full .message-info .content {
163
- display: block;
164
- position: static;
165
- }
166
-
167
- #bottom-panel.full .save,
168
- #bottom-panel.full .share {
169
- bottom: 10px;
170
- }
171
-
172
- #bottom-panel.full button.delete {
173
- display: none;
174
- }
175
-
176
- #bottom-panel.full .message-actions {
177
- position: fixed;
178
- height: 40px;
179
- width: 100%;
180
- left: 0;
181
- bottom: 0;
182
- background-color: #eee;
183
- border-top: 1px solid #dfdfdf;
184
- padding-left: 10px;
185
- }
186
-
187
- #bottom-panel.full .message-actions button {
188
- margin-top: 10px;
189
- }
190
-
191
- .message-actions {
192
- position: absolute;
193
- bottom: 3px;
194
- right: 30px;
195
- }
196
-
197
- .message-actions button {
198
- margin-right: 7px;
199
- }
200
-
201
- .message-actions .share {
202
- text-decoration: none;
203
- color: #333;
204
- }
205
-
206
- .divider {
207
- position: fixed;
208
- bottom: 310px;
209
- left: 0;
210
- right: 0;
211
- height: 10px;
212
- border-top: 1px solid #ddd;
213
- border-bottom: 1px solid #ddd;
214
- background-color: #fafafa;
215
- cursor: row-resize;
216
- z-index: 1;
217
- }
218
-
219
- .divider div {
220
- margin: auto;
221
- width: 24px;
222
- height: 1px;
223
- background-color: #ccc;
224
- position: relative;
225
- }
226
-
227
- .divider .line-1 {
228
- top: 3px;
229
- }
230
-
231
- .divider .line-2 {
232
- top: 4px;
233
- }
234
-
235
- .divider .line-3 {
236
- top: 5px;
237
- }
238
-
239
- #top-panel {
240
- position: fixed;
241
- top: 0;
242
- left: 0;
243
- right: 0;
244
- bottom: 320px;
245
- overflow: auto;
246
- }
247
-
248
- .message-info {
249
- position: absolute;
250
- border-bottom: 1px solid #ddd;
251
- bottom: 35px;
252
- top: 0;
253
- left: 0;
254
- right: 0;
255
- overflow: auto;
256
- }
257
-
258
- .action-panel {
259
- position: absolute;
260
- left: 0;
261
- right: 0;
262
- bottom: 0;
263
- height: 30px;
264
- font-weight: bold;
265
- }
266
- .action-panel input {
267
- position: relative;
268
- top: -1px;
269
- margin-left: 20px;
270
- vertical-align: sub;
271
- }
272
-
273
- .action-panel .clear {
274
- position: absolute;
275
- right: 30px;
276
- vertical-align: middle;
277
- }
278
-
279
- #log-table {
280
- border-collapse: collapse;
281
- margin: auto;
282
- width: 99%;
283
- table-layout: fixed;
284
- }
285
-
286
- .hidden {
287
- display: none;
288
- }
289
-
290
- .message-info pre {
291
- position: relative;
292
- margin: 10px;
293
- }
294
-
295
- #overlay {
296
- position: fixed;
297
- z-index: 99999;
298
- top: 0;
299
- bottom: 0;
300
- left: 0;
301
- right: 0;
302
- cursor: row-resize;
303
- opacity: 0;
304
- }
305
-
306
- .message-info .content {
307
- position: absolute;
308
- top: 5px;
309
- bottom: 35px;
310
- left: 5px;
311
- right: 5px;
312
- overflow: auto;
313
- display: none;
314
- }
315
-
316
- .message-info .content.active {
317
- display: block;
318
- }
319
-
320
- .tabs {
321
- position: absolute;
322
- bottom: 10px;
323
- left: 0;
324
- right: 0;
325
- list-style-type: none;
326
- border-top: 1px solid #ddd;
327
- margin: 0 0 5px;
328
- padding: 0 0 0 14px;
329
- }
330
- .tabs li {
331
- float: left;
332
- position: relative;
333
- padding-right: 5px;
334
- margin: 0;
335
- }
336
- .tabs a {
337
- position: relative;
338
- top: 4px;
339
- text-decoration: none;
340
- color: #333;
341
- border: 1px solid #ddd;
342
- border-top: none;
343
- border-bottom-left-radius: 5px;
344
- border-bottom-right-radius: 5px;
345
- padding: 4px;
346
- background-color: #e1e1e1;
347
- }
348
-
349
- .tabs a.active {
350
- border-top: 1px solid #f1f1f1;
351
- background-color: #f1f1f1;
352
- }
353
-
354
- .btn {
355
- display: inline-block;
356
- margin: 0;
357
- padding: 2px 12px;
358
- font-weight: 500;
359
- font-size: 1em;
360
- line-height: 18px;
361
- text-align: center;
362
- cursor: pointer;
363
- transition: all 0.25s;
364
- background-color: #ddd;
365
- text-decoration: none;
366
- border: none;
367
- color: #333;
368
- font-weight: normal;
369
- }
370
-
371
- .btn:hover {
372
- color: #000;
373
- background-color: #ccc;
374
- }
375
-
376
- .btn .fa {
377
- margin-right: 7px;
378
- }
379
-
380
- .btn:active {
381
- text-shadow: none;
382
- }
383
-
384
- .btn.danger:hover {
385
- background-color: #c63c1b;
386
- color: #eee;
387
- }
1
+ body {
2
+ font-family: "Roboto", Arial, "Liberation Sans", "DejaVu Sans", sans-serif;
3
+ font-size: 12px;
4
+ }
5
+
6
+ body.mobile,
7
+ body.mobile .message {
8
+ font-size: 14px;
9
+ }
10
+
11
+ pre {
12
+ font-family: "Roboto Mono", Consolas, Monaco, Ubuntu Mono, monospace;
13
+ }
14
+
15
+ table.env-table tbody tr td {
16
+ border-top: none;
17
+ line-height: 18px;
18
+ vertical-align: top;
19
+ }
20
+
21
+ table.env-table,
22
+ table.env-table table {
23
+ border-spacing: 0;
24
+ border-collapse: collapse;
25
+ }
26
+
27
+ table.env-table td {
28
+ padding-right: 5px;
29
+ }
30
+
31
+ tbody tr {
32
+ width: 98%;
33
+ }
34
+
35
+ tbody tr td {
36
+ border-top: 1px #e9e9e9 solid;
37
+ line-height: 25px;
38
+ }
39
+
40
+ .message-row:hover {
41
+ background-color: #f8f8f8;
42
+ cursor: pointer;
43
+ }
44
+
45
+ .message-row.selected {
46
+ background-color: #dfdfdf;
47
+ }
48
+
49
+ th {
50
+ text-align: left;
51
+ padding-right: 10px;
52
+ color: #222;
53
+ padding-bottom: 8px;
54
+ }
55
+
56
+ td.time {
57
+ color: #999;
58
+ vertical-align: top;
59
+ font-size: 12px;
60
+ }
61
+
62
+ td.severity {
63
+ text-align: center;
64
+ }
65
+
66
+ .message {
67
+ overflow: hidden;
68
+ white-space: nowrap;
69
+ text-overflow: ellipsis;
70
+ padding-right: 10px;
71
+ font-size: 13px;
72
+ }
73
+
74
+ th.count {
75
+ width: 20px;
76
+ }
77
+
78
+ th.severity {
79
+ width: 15px;
80
+ }
81
+
82
+ th.time {
83
+ width: 40px;
84
+ text-align: right;
85
+ padding-right: 20px;
86
+ }
87
+
88
+ td.time {
89
+ text-align: right;
90
+ padding-right: 8px;
91
+ }
92
+
93
+ th.protected {
94
+ width: 10px;
95
+ }
96
+
97
+ i.fatal {
98
+ color: #e00;
99
+ }
100
+
101
+ i.error {
102
+ color: #900;
103
+ }
104
+
105
+ i.warning {
106
+ color: #feb800;
107
+ }
108
+
109
+ .debug {
110
+ color: #777;
111
+ }
112
+
113
+ td.count {
114
+ text-align: right;
115
+ padding-right: 4px;
116
+ }
117
+
118
+ .count span {
119
+ font-size: 11px;
120
+ font-weight: bold;
121
+ }
122
+
123
+ .action-panel .search {
124
+ border: 1px solid #ddd;
125
+ padding: 3px;
126
+ vertical-align: middle;
127
+ box-sizing: border-box;
128
+ }
129
+
130
+ tr.show-more {
131
+ text-align: center;
132
+ height: 30px;
133
+ text-decoration: none;
134
+ background-color: #ddd;
135
+ cursor: pointer;
136
+ }
137
+
138
+ #bottom-panel {
139
+ position: fixed;
140
+ bottom: 0;
141
+ left: 0;
142
+ right: 0;
143
+ height: 300px;
144
+ background-color: #f1f1f1;
145
+ padding: 8px;
146
+ }
147
+
148
+ #bottom-panel.full {
149
+ position: static;
150
+ background-color: inherit;
151
+ height: 90%;
152
+ }
153
+
154
+ #bottom-panel.full > div {
155
+ padding-bottom: 40px;
156
+ }
157
+ #bottom-panel.full .tabs {
158
+ display: none;
159
+ }
160
+
161
+ #bottom-panel.full .message-info {
162
+ position: static;
163
+ }
164
+
165
+ #bottom-panel.full .message-info .content {
166
+ display: block;
167
+ position: static;
168
+ }
169
+
170
+ #bottom-panel.full .save,
171
+ #bottom-panel.full .share {
172
+ bottom: 10px;
173
+ }
174
+
175
+ #bottom-panel.full button.delete {
176
+ display: none;
177
+ }
178
+
179
+ #bottom-panel.full .message-actions button {
180
+ margin-top: 8px;
181
+ }
182
+
183
+ #bottom-panel.full .message-actions {
184
+ position: fixed;
185
+ height: 40px;
186
+ width: 100%;
187
+ left: 0;
188
+ bottom: 0;
189
+ background-color: #eee;
190
+ border-top: 1px solid #dfdfdf;
191
+ padding-left: 10px;
192
+ }
193
+
194
+ .message-actions {
195
+ position: absolute;
196
+ bottom: 5px;
197
+ right: 0;
198
+ margin-right: 10px;
199
+ }
200
+
201
+ .message-actions button {
202
+ margin-left: 5px;
203
+ }
204
+
205
+ .divider {
206
+ position: fixed;
207
+ bottom: 310px;
208
+ left: 0;
209
+ right: 0;
210
+ height: 15px;
211
+ border-top: 1px solid #ddd;
212
+ border-bottom: 1px solid #ddd;
213
+ background-color: #fafafa;
214
+ cursor: row-resize;
215
+ z-index: 1;
216
+ }
217
+
218
+ .divider div {
219
+ margin: auto;
220
+ width: 24px;
221
+ height: 1px;
222
+ background-color: #ccc;
223
+ position: relative;
224
+ }
225
+
226
+ .divider .line-1 {
227
+ top: 5px;
228
+ }
229
+
230
+ .divider .line-2 {
231
+ top: 6px;
232
+ }
233
+
234
+ .divider .line-3 {
235
+ top: 7px;
236
+ }
237
+
238
+ #top-panel {
239
+ position: fixed;
240
+ top: 0;
241
+ left: 0;
242
+ right: 0;
243
+ bottom: 320px;
244
+ overflow: auto;
245
+ }
246
+
247
+ .message-info {
248
+ position: absolute;
249
+ border-bottom: 1px solid #ddd;
250
+ top: 0;
251
+ left: 0;
252
+ right: 0;
253
+ }
254
+
255
+ .action-panel {
256
+ position: absolute;
257
+ left: 0;
258
+ right: 0;
259
+ bottom: 0;
260
+ font-weight: bold;
261
+ }
262
+
263
+ .action-panel input {
264
+ margin: 0;
265
+ }
266
+
267
+ .action-panel i.fa,
268
+ input,
269
+ label span {
270
+ vertical-align: middle;
271
+ }
272
+
273
+ .severity-filters label {
274
+ margin-right: 18px;
275
+ }
276
+
277
+ .action-panel .clear {
278
+ float: right;
279
+ vertical-align: middle;
280
+ }
281
+
282
+ #log-table {
283
+ border-collapse: collapse;
284
+ margin: auto;
285
+ width: 99%;
286
+ table-layout: fixed;
287
+ }
288
+
289
+ .btn .fa,
290
+ .btn span {
291
+ vertical-align: middle;
292
+ }
293
+
294
+ .hidden {
295
+ display: none;
296
+ }
297
+
298
+ .message-info pre,
299
+ .message-info .env-table {
300
+ position: relative;
301
+ margin: 10px;
302
+ }
303
+
304
+ #overlay {
305
+ position: fixed;
306
+ z-index: 99999;
307
+ top: 0;
308
+ bottom: 0;
309
+ left: 0;
310
+ right: 0;
311
+ cursor: row-resize;
312
+ opacity: 0;
313
+ }
314
+
315
+ .message-info .content {
316
+ position: absolute;
317
+ top: 5px;
318
+ bottom: 35px;
319
+ left: 5px;
320
+ right: 0;
321
+ overflow: auto;
322
+ display: none;
323
+ }
324
+
325
+ .message-info .content.active {
326
+ display: block;
327
+ }
328
+
329
+ .tabs {
330
+ position: absolute;
331
+ bottom: 13px;
332
+ left: 0;
333
+ right: 0;
334
+ list-style-type: none;
335
+ border-top: 1px solid #ddd;
336
+ margin: 0 0 5px;
337
+ padding: 0 0 0 10px;
338
+ }
339
+ .tabs li {
340
+ float: left;
341
+ position: relative;
342
+ padding-right: 5px;
343
+ margin: 0;
344
+ }
345
+ .tabs a {
346
+ position: relative;
347
+ top: 6px;
348
+ text-decoration: none;
349
+ color: #333;
350
+ border: 1px solid #ddd;
351
+ border-top: none;
352
+ border-bottom-left-radius: 5px;
353
+ border-bottom-right-radius: 5px;
354
+ padding: 6px;
355
+ background-color: #e1e1e1;
356
+ }
357
+
358
+ .tabs a.active {
359
+ border-top: 1px solid #f1f1f1;
360
+ background-color: #f1f1f1;
361
+ }
362
+
363
+ .btn {
364
+ display: inline-block;
365
+ margin: 0;
366
+ padding: 5px 12px;
367
+ font-weight: 500;
368
+ font-size: 1em;
369
+ line-height: 0;
370
+ text-align: center;
371
+ cursor: pointer;
372
+ transition: all 0.25s;
373
+ background-color: #ddd;
374
+ text-decoration: none;
375
+ border: none;
376
+ color: #333;
377
+ font-weight: normal;
378
+ }
379
+
380
+ .btn:hover {
381
+ color: #000;
382
+ background-color: #ccc;
383
+ }
384
+
385
+ .btn .fa {
386
+ margin-right: 7px;
387
+ }
388
+
389
+ .btn:active {
390
+ text-shadow: none;
391
+ }
392
+
393
+ .btn.danger:hover {
394
+ background-color: #c63c1b;
395
+ color: #eee;
396
+ }
397
+
398
+ .search-clear-all .search,
399
+ .search-clear-all .clear {
400
+ height: 24px;
401
+ }
402
+
403
+ .severity-filters label,
404
+ .search-clear-all .search,
405
+ .search-clear-all .clear {
406
+ align-self: center;
407
+ }
408
+
409
+ .search-clear-all .clear {
410
+ margin-left: auto;
411
+ }
412
+
413
+ @media (min-width: 701px) {
414
+ .severity-filters,
415
+ .search-clear-all {
416
+ height: 100%;
417
+ }
418
+ .severity-filters,
419
+ .search-clear-all,
420
+ .more-wrapping {
421
+ display: flex;
422
+ }
423
+ .severity-filters {
424
+ float: left;
425
+ }
426
+ .action-panel {
427
+ padding: 10px;
428
+ box-sizing: border-box;
429
+ height: 42px;
430
+ }
431
+ .message-info {
432
+ bottom: 42px;
433
+ }
434
+ }
435
+
436
+ @media (max-width: 700px) {
437
+ .severity-filters {
438
+ padding: 10px;
439
+ }
440
+ .search-clear-all {
441
+ padding: 10px;
442
+ padding-top: 0;
443
+ }
444
+ .action-panel {
445
+ height: 69px;
446
+ }
447
+ .message-info {
448
+ bottom: 69px;
449
+ }
450
+ }
451
+
452
+ @media (max-width: 415px) {
453
+ .severity-filters {
454
+ overflow-x: scroll;
455
+ overflow-y: hidden;
456
+ white-space: nowrap;
457
+ }
458
+ .more-wrapping:before,
459
+ .more-wrapping:after {
460
+ content: "";
461
+ position: absolute;
462
+ height: 15px;
463
+ }
464
+ .more-wrapping:before {
465
+ width: 15px;
466
+ margin-left: -10px;
467
+ background: linear-gradient(to right, #f1f1f1 0%, rgba(61, 65, 71, 0) 100%);
468
+ }
469
+ .more-wrapping:after {
470
+ right: 0;
471
+ width: 23px;
472
+ background: linear-gradient(to right, rgba(61, 65, 71, 0) 0%, #f1f1f1 100%);
473
+ }
474
+ }
475
+
476
+ .btn.no-text .fa {
477
+ margin: 0;
478
+ }
479
+
480
+ .actions-menu {
481
+ position: absolute;
482
+ background: #fafafa;
483
+ display: inline-flex;
484
+ flex-direction: column;
485
+ bottom: 27px;
486
+ right: 45px;
487
+ width: 115px;
488
+ padding: 5px;
489
+ padding-bottom: 0px;
490
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.15);
491
+ z-index: 2;
492
+ }
493
+
494
+ .actions-menu button {
495
+ margin: 0 0 5px 0;
496
+ height: 27px;
497
+ }