logster 2.1.2 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +21 -19
  3. data/.rubocop.yml +1 -1
  4. data/.travis.yml +16 -16
  5. data/CHANGELOG.md +224 -172
  6. data/Gemfile +4 -4
  7. data/Guardfile +8 -8
  8. data/LICENSE.txt +22 -22
  9. data/README.md +99 -99
  10. data/Rakefile +21 -21
  11. data/assets/fonts/FontAwesome.otf +0 -0
  12. data/assets/fonts/fontawesome-webfont.eot +0 -0
  13. data/assets/fonts/fontawesome-webfont.svg +639 -639
  14. data/assets/fonts/fontawesome-webfont.ttf +0 -0
  15. data/assets/fonts/fontawesome-webfont.woff +0 -0
  16. data/assets/fonts/fontawesome-webfont.woff2 +0 -0
  17. data/assets/images/Icon-144_rounded.png +0 -0
  18. data/assets/images/Icon-144_square.png +0 -0
  19. data/assets/images/icon_144x144.png +0 -0
  20. data/assets/images/icon_64x64.png +0 -0
  21. data/assets/javascript/client-app.js +115 -106
  22. data/assets/stylesheets/client-app.css +1 -1
  23. data/build_client_app.sh +0 -0
  24. data/client-app/.editorconfig +20 -20
  25. data/client-app/.ember-cli +9 -9
  26. data/client-app/.eslintignore +19 -19
  27. data/client-app/.eslintrc.js +46 -46
  28. data/client-app/.gitignore +23 -23
  29. data/client-app/.travis.yml +27 -27
  30. data/client-app/.watchmanconfig +3 -3
  31. data/client-app/README.md +57 -57
  32. data/client-app/app/app.js +0 -0
  33. data/client-app/app/components/actions-menu.js +43 -43
  34. data/client-app/app/components/env-tab.js +80 -80
  35. data/client-app/app/components/message-info.js +0 -0
  36. data/client-app/app/components/message-row.js +0 -0
  37. data/client-app/app/components/panel-resizer.js +0 -0
  38. data/client-app/app/components/patterns-list.js +109 -0
  39. data/client-app/app/components/tab-contents.js +27 -27
  40. data/client-app/app/components/tabbed-section.js +0 -0
  41. data/client-app/app/components/time-formatter.js +0 -0
  42. data/client-app/app/components/update-time.js +0 -0
  43. data/client-app/app/controllers/index.js +22 -6
  44. data/client-app/app/controllers/show.js +0 -0
  45. data/client-app/app/helpers/logster-url.js +12 -0
  46. data/client-app/app/helpers/or.js +7 -0
  47. data/client-app/app/index.html +30 -29
  48. data/client-app/app/initializers/app-init.js +67 -67
  49. data/client-app/app/lib/preload.js +20 -20
  50. data/client-app/app/lib/utilities.js +150 -149
  51. data/client-app/app/models/message-collection.js +0 -0
  52. data/client-app/app/models/message.js +100 -100
  53. data/client-app/app/models/pattern-item.js +25 -0
  54. data/client-app/app/resolver.js +0 -0
  55. data/client-app/app/router.js +1 -0
  56. data/client-app/app/routes/index.js +2 -9
  57. data/client-app/app/routes/settings.js +15 -0
  58. data/client-app/app/routes/show.js +0 -0
  59. data/client-app/app/styles/app.css +633 -527
  60. data/client-app/app/templates/application.hbs +2 -2
  61. data/client-app/app/templates/components/actions-menu.hbs +12 -12
  62. data/client-app/app/templates/components/env-tab.hbs +10 -10
  63. data/client-app/app/templates/components/message-info.hbs +41 -41
  64. data/client-app/app/templates/components/message-row.hbs +15 -15
  65. data/client-app/app/templates/components/panel-resizer.hbs +3 -3
  66. data/client-app/app/templates/components/patterns-list.hbs +25 -0
  67. data/client-app/app/templates/components/tabbed-section.hbs +10 -10
  68. data/client-app/app/templates/components/time-formatter.hbs +1 -1
  69. data/client-app/app/templates/index.hbs +65 -58
  70. data/client-app/app/templates/settings.hbs +26 -0
  71. data/client-app/app/templates/show.hbs +7 -7
  72. data/client-app/config/environment.js +51 -51
  73. data/client-app/config/optional-features.json +3 -3
  74. data/client-app/config/targets.js +18 -18
  75. data/client-app/ember-cli-build.js +29 -29
  76. data/client-app/package-lock.json +11357 -11365
  77. data/client-app/package.json +57 -56
  78. data/client-app/public/assets/images/icon_144x144.png +0 -0
  79. data/client-app/public/assets/images/icon_64x64.png +0 -0
  80. data/client-app/testem.js +25 -25
  81. data/client-app/tests/index.html +34 -34
  82. data/client-app/tests/integration/components/env-tab-test.js +134 -123
  83. data/client-app/tests/integration/components/message-info-test.js +111 -111
  84. data/client-app/tests/integration/components/patterns-list-test.js +56 -0
  85. data/client-app/tests/test-helper.js +8 -8
  86. data/client-app/tests/unit/controllers/index-test.js +12 -12
  87. data/client-app/tests/unit/controllers/show-test.js +12 -12
  88. data/client-app/tests/unit/initializers/app-init-test.js +31 -31
  89. data/client-app/tests/unit/routes/index-test.js +11 -11
  90. data/client-app/tests/unit/routes/show-test.js +11 -11
  91. data/lib/examples/sidekiq_logster_reporter.rb +21 -21
  92. data/lib/logster.rb +59 -54
  93. data/lib/logster/base_store.rb +169 -141
  94. data/lib/logster/cache.rb +20 -0
  95. data/lib/logster/configuration.rb +27 -26
  96. data/lib/logster/defer_logger.rb +14 -14
  97. data/lib/logster/ignore_pattern.rb +65 -65
  98. data/lib/logster/logger.rb +113 -113
  99. data/lib/logster/message.rb +212 -212
  100. data/lib/logster/middleware/debug_exceptions.rb +26 -26
  101. data/lib/logster/middleware/reporter.rb +55 -55
  102. data/lib/logster/middleware/viewer.rb +297 -222
  103. data/lib/logster/pattern.rb +95 -0
  104. data/lib/logster/rails/railtie.rb +63 -63
  105. data/lib/logster/redis_store.rb +584 -566
  106. data/lib/logster/scheduler.rb +54 -54
  107. data/lib/logster/suppression_pattern.rb +17 -0
  108. data/lib/logster/version.rb +3 -3
  109. data/lib/logster/web.rb +14 -14
  110. data/logster.gemspec +35 -35
  111. data/test/examples/test_sidekiq_reporter_example.rb +46 -46
  112. data/test/fake_data/Gemfile +4 -4
  113. data/test/fake_data/generate.rb +10 -10
  114. data/test/logster/middleware/test_reporter.rb +19 -19
  115. data/test/logster/middleware/test_viewer.rb +267 -96
  116. data/test/logster/test_base_store.rb +147 -147
  117. data/test/logster/test_cache.rb +38 -0
  118. data/test/logster/test_defer_logger.rb +34 -34
  119. data/test/logster/test_ignore_pattern.rb +41 -41
  120. data/test/logster/test_logger.rb +100 -86
  121. data/test/logster/test_message.rb +119 -119
  122. data/test/logster/test_pattern.rb +152 -0
  123. data/test/logster/test_redis_rate_limiter.rb +230 -230
  124. data/test/logster/test_redis_store.rb +689 -720
  125. data/test/test_helper.rb +38 -38
  126. data/vendor/assets/javascripts/logster.js.erb +39 -39
  127. metadata +24 -7
@@ -1,100 +1,100 @@
1
- import { ajax } 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("env.{application_version,length}", function() {
60
- const backtrace = this.get("backtrace");
61
- const env = this.get("env");
62
- const appVersion = Array.isArray(env)
63
- ? env
64
- .map(e => e.application_version)
65
- .compact()
66
- .join("")
67
- : env && env.application_version;
68
- return appVersion && backtrace && backtrace.length > 0;
69
- }),
70
-
71
- rowClass: computed("severity", function() {
72
- switch (this.get("severity")) {
73
- case 0:
74
- return "debug";
75
- case 1:
76
- return "info";
77
- case 2:
78
- return "warn";
79
- case 3:
80
- return "error";
81
- case 4:
82
- return "fatal";
83
- }
84
- }),
85
-
86
- glyph: computed("severity", function() {
87
- switch (this.get("severity")) {
88
- case 0:
89
- return "";
90
- case 1:
91
- return "";
92
- case 2:
93
- return "<i class='fa fa-exclamation-circle warning'></i>";
94
- case 3:
95
- return "<i class='fa fa-times-circle error'></i>";
96
- case 4:
97
- return "<i class='fa fa-times-circle fatal'></i>";
98
- }
99
- })
100
- });
1
+ import { ajax } 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("env.{application_version,length}", function() {
60
+ const backtrace = this.get("backtrace");
61
+ const env = this.get("env");
62
+ const appVersion = Array.isArray(env)
63
+ ? env
64
+ .map(e => e.application_version)
65
+ .compact()
66
+ .join("")
67
+ : env && env.application_version;
68
+ return appVersion && backtrace && backtrace.length > 0;
69
+ }),
70
+
71
+ rowClass: computed("severity", function() {
72
+ switch (this.get("severity")) {
73
+ case 0:
74
+ return "debug";
75
+ case 1:
76
+ return "info";
77
+ case 2:
78
+ return "warn";
79
+ case 3:
80
+ return "error";
81
+ case 4:
82
+ return "fatal";
83
+ }
84
+ }),
85
+
86
+ glyph: computed("severity", function() {
87
+ switch (this.get("severity")) {
88
+ case 0:
89
+ return "";
90
+ case 1:
91
+ return "";
92
+ case 2:
93
+ return "<i class='fa fa-exclamation-circle warning'></i>";
94
+ case 3:
95
+ return "<i class='fa fa-times-circle error'></i>";
96
+ case 4:
97
+ return "<i class='fa fa-times-circle fatal'></i>";
98
+ }
99
+ })
100
+ });
@@ -0,0 +1,25 @@
1
+ import { default as EmberObject, computed } from "@ember/object";
2
+
3
+ export default EmberObject.extend({
4
+ isNew: false,
5
+ value: "",
6
+ valueBuffer: "",
7
+ error: null,
8
+ saving: false,
9
+
10
+ init() {
11
+ this._super(...arguments);
12
+ this.set("valueBuffer", this.get("value"));
13
+ },
14
+
15
+ updateValue(newValue) {
16
+ this.setProperties({
17
+ value: newValue,
18
+ valueBuffer: newValue
19
+ });
20
+ },
21
+
22
+ hasBuffer: computed("value", "valueBuffer", function() {
23
+ return this.get("value") !== this.get("valueBuffer");
24
+ })
25
+ });
File without changes
@@ -9,6 +9,7 @@ const Router = EmberRouter.extend({
9
9
  Router.map(function() {
10
10
  this.route("index", { path: "/" });
11
11
  this.route("show", { path: "/show/:id" });
12
+ this.route("settings");
12
13
  });
13
14
 
14
15
  export default Router;
@@ -10,16 +10,9 @@ export default Route.extend({
10
10
 
11
11
  setupController(controller, model) {
12
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
- });
13
+ model.setProperties(controller.getProperties("filter", "search"));
22
14
  model.reload();
15
+ controller.set("initialized", true);
23
16
 
24
17
  let times = 0;
25
18
  let backoff = 1;
@@ -0,0 +1,15 @@
1
+ import Route from "@ember/routing/route";
2
+ import { ajax } from "client-app/lib/utilities";
3
+
4
+ export default Route.extend({
5
+ model() {
6
+ return ajax("/settings.json");
7
+ },
8
+
9
+ setupController(controller, model) {
10
+ this._super(...arguments);
11
+ const showCodedPatterns =
12
+ model.coded_patterns && model.coded_patterns.length > 0;
13
+ controller.set("showCodedPatterns", showCodedPatterns);
14
+ }
15
+ });
File without changes
@@ -1,527 +1,633 @@
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
- height: 18px;
19
- vertical-align: top;
20
- }
21
-
22
- table.env-table,
23
- table.env-table table {
24
- border-spacing: 0;
25
- border-collapse: collapse;
26
- }
27
-
28
- table.env-table td {
29
- padding-right: 5px;
30
- }
31
-
32
- tbody tr {
33
- width: 98%;
34
- }
35
-
36
- .message-row {
37
- display: flex;
38
- }
39
-
40
- .message-row .severity,
41
- .message-row .protected {
42
- text-align: center;
43
- width: 25px;
44
- flex-grow: 0;
45
- flex-shrink: 0;
46
- font-size: 12px;
47
- }
48
-
49
- .message-row div {
50
- border-top: 0.5px #e9e9e9 solid;
51
- padding-top: 1px;
52
- padding-bottom: 1px;
53
- line-height: 25px;
54
- }
55
-
56
- .message-row .count {
57
- width: 30px;
58
- flex-grow: 0;
59
- flex-shrink: 0;
60
- padding-right: 4px;
61
- box-sizing: border-box;
62
- font-size: 11px;
63
- font-weight: 700;
64
- }
65
-
66
- .message-row .message-body {
67
- flex-grow: 1;
68
- flex-shrink: 1;
69
- overflow: hidden;
70
- white-space: nowrap;
71
- text-overflow: ellipsis;
72
- font-size: 13px;
73
- }
74
-
75
- .message-row .time {
76
- flex-grow: 0;
77
- flex-shrink: 0;
78
- color: #999;
79
- vertical-align: top;
80
- font-size: 12px;
81
- padding-right: 8px;
82
- }
83
-
84
- .message-row .count {
85
- text-align: right;
86
- }
87
-
88
- .message-row:hover {
89
- background-color: #f8f8f8;
90
- cursor: pointer;
91
- }
92
-
93
- .message-row.selected {
94
- background-color: #dfdfdf;
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
- .action-panel .search {
114
- border: 1px solid #ddd;
115
- padding: 3px;
116
- vertical-align: middle;
117
- box-sizing: border-box;
118
- }
119
-
120
- #log-table .show-more {
121
- text-align: center;
122
- height: 30px;
123
- line-height: 30px;
124
- text-decoration: none;
125
- background-color: #ddd;
126
- cursor: pointer;
127
- margin-top: 8px;
128
- }
129
-
130
- #bottom-panel {
131
- position: fixed;
132
- bottom: 0;
133
- left: 0;
134
- right: 0;
135
- height: 300px;
136
- background-color: #f1f1f1;
137
- padding: 8px;
138
- padding-top: 0;
139
- z-index: 2;
140
- }
141
-
142
- #bottom-panel.full {
143
- position: static;
144
- background-color: inherit;
145
- height: 90%;
146
- }
147
-
148
- #bottom-panel.full > div {
149
- padding-bottom: 40px;
150
- }
151
- #bottom-panel.full .tabs {
152
- display: none;
153
- }
154
-
155
- #bottom-panel.full .message-info {
156
- position: static;
157
- }
158
-
159
- #bottom-panel.full .message-info .content {
160
- display: block;
161
- position: static;
162
- }
163
-
164
- #bottom-panel.full .save,
165
- #bottom-panel.full .share {
166
- bottom: 10px;
167
- }
168
-
169
- #bottom-panel.full button.delete {
170
- display: none;
171
- }
172
-
173
- #bottom-panel.full .message-actions button {
174
- margin-top: 8px;
175
- }
176
-
177
- #bottom-panel.full .message-actions {
178
- position: fixed;
179
- height: 40px;
180
- width: 100%;
181
- left: 0;
182
- bottom: 0;
183
- background-color: #eee;
184
- border-top: 1px solid #dfdfdf;
185
- padding-left: 10px;
186
- }
187
-
188
- .message-actions {
189
- position: absolute;
190
- bottom: 5px;
191
- right: 0;
192
- margin-right: 10px;
193
- }
194
-
195
- .message-actions button {
196
- margin-left: 5px;
197
- }
198
-
199
- .divider {
200
- position: fixed;
201
- bottom: 310px;
202
- left: 0;
203
- right: 0;
204
- height: 15px;
205
- border-top: 1px solid #ddd;
206
- border-bottom: 1px solid #ddd;
207
- background-color: #fafafa;
208
- cursor: row-resize;
209
- }
210
-
211
- .divider div {
212
- margin: auto;
213
- width: 24px;
214
- height: 1px;
215
- background-color: #ccc;
216
- position: relative;
217
- }
218
-
219
- .divider .line-1 {
220
- top: 5px;
221
- }
222
-
223
- .divider .line-2 {
224
- top: 6px;
225
- }
226
-
227
- .divider .line-3 {
228
- top: 7px;
229
- }
230
-
231
- #top-panel {
232
- position: fixed;
233
- top: 0;
234
- left: 0;
235
- right: 0;
236
- bottom: 320px;
237
- overflow: auto;
238
- }
239
-
240
- .message-info {
241
- position: absolute;
242
- border-bottom: 1px solid #ddd;
243
- top: 0;
244
- left: 0;
245
- right: 0;
246
- }
247
-
248
- .action-panel {
249
- position: absolute;
250
- left: 0;
251
- right: 0;
252
- bottom: 0;
253
- font-weight: bold;
254
- }
255
-
256
- .action-panel input {
257
- margin: 0;
258
- }
259
-
260
- .action-panel i.fa,
261
- input,
262
- label span {
263
- vertical-align: middle;
264
- }
265
-
266
- .severity-filters label {
267
- margin-right: 18px;
268
- }
269
-
270
- .action-panel .clear {
271
- float: right;
272
- vertical-align: middle;
273
- }
274
-
275
- #log-table {
276
- margin: auto;
277
- width: 99%;
278
- }
279
-
280
- .btn .fa,
281
- .btn span {
282
- vertical-align: middle;
283
- }
284
-
285
- .hidden {
286
- display: none;
287
- }
288
-
289
- .message-info pre,
290
- .message-info .env-table {
291
- position: relative;
292
- margin: 10px;
293
- margin-top: 5px;
294
- }
295
-
296
- #overlay {
297
- position: fixed;
298
- z-index: 99999;
299
- top: 0;
300
- bottom: 0;
301
- left: 0;
302
- right: 0;
303
- cursor: row-resize;
304
- opacity: 0;
305
- }
306
-
307
- .message-info .content {
308
- position: absolute;
309
- top: 0;
310
- bottom: 35px;
311
- left: 0;
312
- right: 0;
313
- overflow: auto;
314
- display: none;
315
- }
316
-
317
- .message-info .content.active {
318
- display: block;
319
- }
320
-
321
- .tabs {
322
- position: absolute;
323
- bottom: 13px;
324
- left: 0;
325
- right: 0;
326
- list-style-type: none;
327
- border-top: 1px solid #ddd;
328
- margin: 0 0 5px;
329
- padding: 0 0 0 10px;
330
- }
331
- .tabs li {
332
- float: left;
333
- position: relative;
334
- padding-right: 5px;
335
- margin: 0;
336
- }
337
- .tabs a {
338
- position: relative;
339
- top: 6px;
340
- text-decoration: none;
341
- color: #333;
342
- border: 1px solid #ddd;
343
- border-top: none;
344
- border-bottom-left-radius: 5px;
345
- border-bottom-right-radius: 5px;
346
- padding: 6px;
347
- background-color: #e1e1e1;
348
- }
349
-
350
- .tabs a.active {
351
- border-top: 1px solid #f1f1f1;
352
- background-color: #f1f1f1;
353
- }
354
-
355
- .btn {
356
- display: inline-block;
357
- margin: 0;
358
- padding: 5px 12px;
359
- font-weight: 500;
360
- font-size: 1em;
361
- line-height: 0;
362
- text-align: center;
363
- cursor: pointer;
364
- transition: all 0.25s;
365
- background-color: #ddd;
366
- text-decoration: none;
367
- border: none;
368
- color: #333;
369
- font-weight: normal;
370
- }
371
-
372
- .btn:hover {
373
- color: #000;
374
- background-color: #ccc;
375
- }
376
-
377
- .btn .fa {
378
- margin-right: 7px;
379
- }
380
-
381
- .btn:active {
382
- text-shadow: none;
383
- }
384
-
385
- .btn.danger:hover {
386
- background-color: #c63c1b;
387
- color: #eee;
388
- }
389
-
390
- .search-clear-all .search,
391
- .search-clear-all .clear {
392
- height: 24px;
393
- }
394
-
395
- .severity-filters label,
396
- .search-clear-all .search,
397
- .search-clear-all .clear {
398
- align-self: center;
399
- }
400
-
401
- .search-clear-all .clear {
402
- margin-left: auto;
403
- }
404
-
405
- @media (min-width: 701px) {
406
- .severity-filters,
407
- .search-clear-all {
408
- height: 100%;
409
- }
410
- .severity-filters,
411
- .search-clear-all,
412
- .more-wrapping {
413
- display: flex;
414
- }
415
- .severity-filters {
416
- float: left;
417
- }
418
- .action-panel {
419
- padding: 10px;
420
- box-sizing: border-box;
421
- height: 42px;
422
- }
423
- .message-info {
424
- bottom: 42px;
425
- }
426
- }
427
-
428
- @media (max-width: 700px) {
429
- .severity-filters {
430
- padding: 10px;
431
- }
432
- .search-clear-all {
433
- padding: 10px;
434
- padding-top: 0;
435
- }
436
- .action-panel {
437
- height: 69px;
438
- }
439
- .message-info {
440
- bottom: 69px;
441
- }
442
- }
443
-
444
- @media (max-width: 415px) {
445
- .severity-filters {
446
- overflow-x: scroll;
447
- overflow-y: hidden;
448
- white-space: nowrap;
449
- }
450
- .more-wrapping:before,
451
- .more-wrapping:after {
452
- content: "";
453
- position: absolute;
454
- height: 18px;
455
- }
456
- .more-wrapping:before {
457
- width: 15px;
458
- margin-left: -10px;
459
- background: linear-gradient(
460
- to right,
461
- #f1f1f1 0%,
462
- rgba(241, 241, 241, 0.001) 100%
463
- );
464
- }
465
- .more-wrapping:after {
466
- right: 0;
467
- width: 23px;
468
- background: linear-gradient(
469
- to left,
470
- #f1f1f1 0%,
471
- rgba(241, 241, 241, 0.001) 100%
472
- );
473
- }
474
- }
475
-
476
- .btn.no-text .fa {
477
- margin: 0;
478
- }
479
-
480
- .btn[disabled] {
481
- opacity: 0.5;
482
- }
483
-
484
- .actions-menu {
485
- position: absolute;
486
- background: #fafafa;
487
- display: inline-flex;
488
- flex-direction: column;
489
- bottom: 27px;
490
- right: 45px;
491
- width: 115px;
492
- padding: 5px;
493
- padding-bottom: 0px;
494
- box-shadow: 0 4px 14px rgba(0, 0, 0, 0.15);
495
- z-index: 3;
496
- }
497
-
498
- .actions-menu button {
499
- margin: 0 0 5px 0;
500
- height: 27px;
501
- }
502
-
503
- .nav-controls {
504
- padding: 10px;
505
- }
506
-
507
- #bottom-panel:not(.full) .nav-controls {
508
- position: sticky;
509
- position: -webkit-sticky;
510
- position: -moz-sticky;
511
- position: -ms-sticky;
512
- position: -o-sticky;
513
- top: 0;
514
- background: #f1f1f1;
515
- z-index: 1;
516
- border-bottom: 1px solid #ddd;
517
- }
518
-
519
- .env-number {
520
- margin: 0 7px;
521
- }
522
-
523
- .expand-list {
524
- text-decoration: underline;
525
- color: blue;
526
- cursor: pointer;
527
- }
1
+ body {
2
+ font-family: 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
+ height: 18px;
19
+ vertical-align: top;
20
+ }
21
+
22
+ table.env-table,
23
+ table.env-table table {
24
+ border-spacing: 0;
25
+ border-collapse: collapse;
26
+ }
27
+
28
+ table.env-table td {
29
+ padding-right: 5px;
30
+ }
31
+
32
+ tbody tr {
33
+ width: 98%;
34
+ }
35
+
36
+ .message-row {
37
+ font-family: "Roboto";
38
+ display: flex;
39
+ }
40
+
41
+ .message-row .severity,
42
+ .message-row .protected {
43
+ text-align: center;
44
+ width: 25px;
45
+ flex-grow: 0;
46
+ flex-shrink: 0;
47
+ font-size: 12px;
48
+ }
49
+
50
+ .message-row div {
51
+ border-top: 0.5px #e9e9e9 solid;
52
+ padding-top: 1px;
53
+ padding-bottom: 1px;
54
+ line-height: 25px;
55
+ }
56
+
57
+ .message-row .count {
58
+ width: 30px;
59
+ flex-grow: 0;
60
+ flex-shrink: 0;
61
+ padding-right: 4px;
62
+ box-sizing: border-box;
63
+ font-size: 11px;
64
+ font-weight: 700;
65
+ }
66
+
67
+ .message-row .message-body {
68
+ flex-grow: 1;
69
+ flex-shrink: 1;
70
+ overflow: hidden;
71
+ white-space: nowrap;
72
+ text-overflow: ellipsis;
73
+ font-size: 13px;
74
+ }
75
+
76
+ .message-row .time {
77
+ flex-grow: 0;
78
+ flex-shrink: 0;
79
+ color: #999;
80
+ vertical-align: top;
81
+ font-size: 12px;
82
+ padding-right: 8px;
83
+ }
84
+
85
+ .message-row .count {
86
+ text-align: right;
87
+ }
88
+
89
+ .message-row:hover {
90
+ background-color: #f8f8f8;
91
+ cursor: pointer;
92
+ }
93
+
94
+ .message-row.selected {
95
+ background-color: #dfdfdf;
96
+ }
97
+
98
+ i.fatal {
99
+ color: #e00;
100
+ }
101
+
102
+ i.error {
103
+ color: #900;
104
+ }
105
+
106
+ i.warning {
107
+ color: #feb800;
108
+ }
109
+
110
+ .debug {
111
+ color: #777;
112
+ }
113
+
114
+ .action-panel .search {
115
+ border: 1px solid #ddd;
116
+ padding: 3px;
117
+ vertical-align: middle;
118
+ box-sizing: border-box;
119
+ }
120
+
121
+ #log-table .show-more {
122
+ text-align: center;
123
+ height: 30px;
124
+ line-height: 30px;
125
+ text-decoration: none;
126
+ background-color: #ddd;
127
+ cursor: pointer;
128
+ margin-top: 8px;
129
+ }
130
+
131
+ #bottom-panel {
132
+ position: fixed;
133
+ bottom: 0;
134
+ left: 0;
135
+ right: 0;
136
+ height: 300px;
137
+ background-color: #f1f1f1;
138
+ padding: 8px;
139
+ padding-top: 0;
140
+ z-index: 2;
141
+ }
142
+
143
+ #bottom-panel.full {
144
+ position: static;
145
+ background-color: inherit;
146
+ height: 90%;
147
+ }
148
+
149
+ #bottom-panel.full > div {
150
+ padding-bottom: 40px;
151
+ }
152
+ #bottom-panel.full .tabs {
153
+ display: none;
154
+ }
155
+
156
+ #bottom-panel.full .message-info {
157
+ position: static;
158
+ }
159
+
160
+ #bottom-panel.full .message-info .content {
161
+ display: block;
162
+ position: static;
163
+ }
164
+
165
+ #bottom-panel.full .save,
166
+ #bottom-panel.full .share {
167
+ bottom: 10px;
168
+ }
169
+
170
+ #bottom-panel.full button.delete {
171
+ display: none;
172
+ }
173
+
174
+ #bottom-panel.full .message-actions button {
175
+ margin-top: 8px;
176
+ }
177
+
178
+ #bottom-panel.full .message-actions {
179
+ position: fixed;
180
+ height: 40px;
181
+ width: 100%;
182
+ left: 0;
183
+ bottom: 0;
184
+ background-color: #eee;
185
+ border-top: 1px solid #dfdfdf;
186
+ padding-left: 10px;
187
+ }
188
+
189
+ .message-actions {
190
+ position: absolute;
191
+ bottom: 5px;
192
+ right: 0;
193
+ margin-right: 10px;
194
+ }
195
+
196
+ .message-actions button {
197
+ margin-left: 5px;
198
+ }
199
+
200
+ .divider {
201
+ position: fixed;
202
+ bottom: 310px;
203
+ left: 0;
204
+ right: 0;
205
+ height: 15px;
206
+ border-top: 1px solid #ddd;
207
+ border-bottom: 1px solid #ddd;
208
+ background-color: #fafafa;
209
+ cursor: row-resize;
210
+ }
211
+
212
+ .divider div {
213
+ margin: auto;
214
+ width: 24px;
215
+ height: 1px;
216
+ background-color: #ccc;
217
+ position: relative;
218
+ }
219
+
220
+ .divider .line-1 {
221
+ top: 5px;
222
+ }
223
+
224
+ .divider .line-2 {
225
+ top: 6px;
226
+ }
227
+
228
+ .divider .line-3 {
229
+ top: 7px;
230
+ }
231
+
232
+ #top-panel {
233
+ position: fixed;
234
+ top: 0;
235
+ left: 0;
236
+ right: 0;
237
+ bottom: 320px;
238
+ overflow: auto;
239
+ }
240
+
241
+ .message-info {
242
+ position: absolute;
243
+ border-bottom: 1px solid #ddd;
244
+ top: 0;
245
+ left: 0;
246
+ right: 0;
247
+ }
248
+
249
+ .action-panel {
250
+ position: absolute;
251
+ left: 0;
252
+ right: 0;
253
+ bottom: 0;
254
+ font-weight: bold;
255
+ }
256
+
257
+ .action-panel input {
258
+ margin: 0;
259
+ }
260
+
261
+ .action-panel i.fa,
262
+ input,
263
+ label span {
264
+ vertical-align: middle;
265
+ }
266
+
267
+ .severity-filters label {
268
+ margin-right: 18px;
269
+ }
270
+
271
+ .search-clear-all .clear {
272
+ float: right;
273
+ vertical-align: middle;
274
+ }
275
+
276
+ #log-table {
277
+ margin: auto;
278
+ width: 99%;
279
+ }
280
+
281
+ .btn .fa,
282
+ .btn span {
283
+ vertical-align: middle;
284
+ }
285
+
286
+ .hidden {
287
+ display: none;
288
+ }
289
+
290
+ .message-info pre,
291
+ .message-info .env-table {
292
+ position: relative;
293
+ margin: 10px;
294
+ margin-top: 5px;
295
+ }
296
+
297
+ #overlay {
298
+ position: fixed;
299
+ z-index: 99999;
300
+ top: 0;
301
+ bottom: 0;
302
+ left: 0;
303
+ right: 0;
304
+ cursor: row-resize;
305
+ opacity: 0;
306
+ }
307
+
308
+ .message-info .content {
309
+ position: absolute;
310
+ top: 0;
311
+ bottom: 35px;
312
+ left: 0;
313
+ right: 0;
314
+ overflow: auto;
315
+ display: none;
316
+ }
317
+
318
+ .message-info .content.active {
319
+ display: block;
320
+ }
321
+
322
+ .tabs {
323
+ position: absolute;
324
+ bottom: 13px;
325
+ left: 0;
326
+ right: 0;
327
+ list-style-type: none;
328
+ border-top: 1px solid #ddd;
329
+ margin: 0 0 5px;
330
+ padding: 0 0 0 10px;
331
+ }
332
+ .tabs li {
333
+ float: left;
334
+ position: relative;
335
+ padding-right: 5px;
336
+ margin: 0;
337
+ }
338
+ .tabs a {
339
+ position: relative;
340
+ top: 6px;
341
+ text-decoration: none;
342
+ color: #333;
343
+ border: 1px solid #ddd;
344
+ border-top: none;
345
+ border-bottom-left-radius: 5px;
346
+ border-bottom-right-radius: 5px;
347
+ padding: 6px;
348
+ background-color: #e1e1e1;
349
+ }
350
+
351
+ .tabs a.active {
352
+ border-top: 1px solid #f1f1f1;
353
+ background-color: #f1f1f1;
354
+ }
355
+
356
+ .btn {
357
+ display: inline-block;
358
+ margin: 0;
359
+ padding: 5px 12px;
360
+ font-weight: 500;
361
+ font-size: 1em;
362
+ line-height: 0;
363
+ text-align: center;
364
+ cursor: pointer;
365
+ transition: all 0.25s;
366
+ background-color: #ddd;
367
+ text-decoration: none;
368
+ border: none;
369
+ color: #333;
370
+ font-weight: normal;
371
+ }
372
+
373
+ .btn:hover {
374
+ color: #000;
375
+ background-color: #ccc;
376
+ }
377
+
378
+ .btn .fa {
379
+ margin-right: 7px;
380
+ }
381
+
382
+ .btn:active {
383
+ text-shadow: none;
384
+ }
385
+
386
+ .btn.danger:hover {
387
+ background-color: #c63c1b;
388
+ color: #eee;
389
+ }
390
+
391
+ .btn.ok {
392
+ background-color: #3781dc;
393
+ color: white;
394
+ }
395
+
396
+ .btn.ok:hover {
397
+ background-color: #286dc2;
398
+ color: white;
399
+ }
400
+
401
+ .search-clear-all .search,
402
+ .search-clear-all .clear {
403
+ height: 100%;
404
+ }
405
+
406
+ .severity-filters label,
407
+ .search-clear-all .search,
408
+ .search-clear-all .clear {
409
+ align-self: center;
410
+ }
411
+
412
+ .search-clear-all .footer-btns .settings {
413
+ margin: 0 7px 0 7px;
414
+ }
415
+
416
+ .search-clear-all {
417
+ display: flex;
418
+ justify-content: space-between;
419
+ }
420
+
421
+ .search-clear-all .search {
422
+ min-width: 0;
423
+ flex-shrink: 2;
424
+ }
425
+
426
+ .footer-btns {
427
+ flex-grow: 0;
428
+ flex-shrink: 0;
429
+ }
430
+
431
+ @media (min-width: 770px) {
432
+ .severity-filters,
433
+ .search-clear-all {
434
+ height: 100%;
435
+ }
436
+ .severity-filters,
437
+ .more-wrapping {
438
+ display: flex;
439
+ }
440
+ .severity-filters {
441
+ float: left;
442
+ }
443
+ .action-panel {
444
+ padding: 10px;
445
+ box-sizing: border-box;
446
+ height: 42px;
447
+ }
448
+ .message-info {
449
+ bottom: 42px;
450
+ }
451
+ }
452
+
453
+ @media (max-width: 770px) {
454
+ .severity-filters {
455
+ padding: 10px;
456
+ }
457
+ .search-clear-all {
458
+ padding: 10px;
459
+ padding-top: 0;
460
+ }
461
+ .action-panel {
462
+ height: 69px;
463
+ }
464
+ .message-info {
465
+ bottom: 69px;
466
+ }
467
+ }
468
+
469
+ @media (max-width: 430px) {
470
+ .severity-filters {
471
+ overflow-x: scroll;
472
+ overflow-y: hidden;
473
+ white-space: nowrap;
474
+ }
475
+ .more-wrapping:before,
476
+ .more-wrapping:after {
477
+ content: "";
478
+ position: absolute;
479
+ height: 18px;
480
+ }
481
+ .more-wrapping:before {
482
+ width: 15px;
483
+ margin-left: -10px;
484
+ background: linear-gradient(
485
+ to right,
486
+ #f1f1f1 0%,
487
+ rgba(241, 241, 241, 0.001) 100%
488
+ );
489
+ }
490
+ .more-wrapping:after {
491
+ right: 0;
492
+ width: 23px;
493
+ background: linear-gradient(
494
+ to left,
495
+ #f1f1f1 0%,
496
+ rgba(241, 241, 241, 0.001) 100%
497
+ );
498
+ }
499
+ }
500
+
501
+ .btn.no-text .fa {
502
+ margin: 0;
503
+ }
504
+
505
+ .btn[disabled] {
506
+ opacity: 0.5;
507
+ }
508
+
509
+ .actions-menu {
510
+ position: absolute;
511
+ background: #fafafa;
512
+ display: inline-flex;
513
+ flex-direction: column;
514
+ bottom: 27px;
515
+ right: 45px;
516
+ width: 115px;
517
+ padding: 5px;
518
+ padding-bottom: 0px;
519
+ box-shadow: 0 4px 14px rgba(0, 0, 0, 0.15);
520
+ z-index: 3;
521
+ }
522
+
523
+ .actions-menu button {
524
+ margin: 0 0 5px 0;
525
+ height: 27px;
526
+ }
527
+
528
+ .nav-controls {
529
+ padding: 10px;
530
+ }
531
+
532
+ #bottom-panel:not(.full) .nav-controls {
533
+ position: sticky;
534
+ position: -webkit-sticky;
535
+ position: -moz-sticky;
536
+ position: -ms-sticky;
537
+ position: -o-sticky;
538
+ top: 0;
539
+ background: #f1f1f1;
540
+ z-index: 1;
541
+ border-bottom: 1px solid #ddd;
542
+ }
543
+
544
+ .env-number {
545
+ margin: 0 7px;
546
+ }
547
+
548
+ .expand-list {
549
+ text-decoration: underline;
550
+ color: blue;
551
+ cursor: pointer;
552
+ }
553
+
554
+ .settings-page {
555
+ max-width: 1110px;
556
+ margin-right: auto;
557
+ margin-left: auto;
558
+ font-size: 15px;
559
+ padding: 0 10px;
560
+ }
561
+
562
+ .settings-header {
563
+ display: flex;
564
+ align-items: center;
565
+ margin-bottom: 5px;
566
+ }
567
+
568
+ .settings-header .header-title {
569
+ flex-grow: 1;
570
+ }
571
+
572
+ .settings-header .header-logo {
573
+ width: 50px;
574
+ height: 50px;
575
+ }
576
+
577
+ .settings-section {
578
+ border-top: 1px solid #ddd;
579
+ padding-top: 15px;
580
+ }
581
+
582
+ .settings-section .section-title {
583
+ margin-top: 0;
584
+ }
585
+
586
+ .settings-section .subsection-title {
587
+ margin-bottom: 10px;
588
+ }
589
+
590
+ .settings-section .tip {
591
+ font-style: italic;
592
+ font-size: 13px;
593
+ color: grey;
594
+ }
595
+
596
+ .settings-section .pattern-wrapper {
597
+ margin-top: 10px;
598
+ font-size: 16px;
599
+ display: flex;
600
+ height: 33px;
601
+ }
602
+
603
+ .settings-section .api-error {
604
+ font-family: Consolas, "Roboto Mono", Monaco, Ubuntu Mono, monospace;
605
+ margin-top: 5px;
606
+ color: red;
607
+ }
608
+
609
+ .pattern-wrapper .pattern-input {
610
+ font-family: Consolas, "Roboto Mono", Monaco, Ubuntu Mono, monospace;
611
+ width: 600px;
612
+ font-size: inherit;
613
+ padding: 5px 0 5px 0;
614
+ height: 100%;
615
+ box-sizing: border-box;
616
+ vertical-align: middle;
617
+ flex-grow: 1;
618
+ flex-shrink: 1;
619
+ }
620
+
621
+ .btn.new-pattern {
622
+ height: 100%;
623
+ line-height: 18px;
624
+ }
625
+
626
+ .pattern-wrapper .btn {
627
+ height: 100%;
628
+ box-sizing: border-box;
629
+ vertical-align: middle;
630
+ flex-grow: 0;
631
+ flex-shrink: 0;
632
+ margin-left: 10px;
633
+ }