logster 2.1.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +19 -19
  3. data/.rubocop.yml +1 -1
  4. data/.travis.yml +16 -16
  5. data/CHANGELOG.md +169 -166
  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 +100 -100
  22. data/assets/stylesheets/client-app.css +0 -0
  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 +14 -14
  33. data/client-app/app/components/actions-menu.js +37 -37
  34. data/client-app/app/components/env-tab.js +44 -44
  35. data/client-app/app/components/message-info.js +65 -65
  36. data/client-app/app/components/message-row.js +45 -45
  37. data/client-app/app/components/panel-resizer.js +74 -74
  38. data/client-app/app/components/tab-contents.js +27 -27
  39. data/client-app/app/components/tab-link.js +5 -5
  40. data/client-app/app/components/tabbed-section.js +32 -32
  41. data/client-app/app/components/time-formatter.js +25 -25
  42. data/client-app/app/components/update-time.js +21 -21
  43. data/client-app/app/controllers/index.js +105 -105
  44. data/client-app/app/controllers/show.js +13 -13
  45. data/client-app/app/index.html +29 -29
  46. data/client-app/app/initializers/app-init.js +72 -72
  47. data/client-app/app/lib/preload.js +14 -14
  48. data/client-app/app/lib/utilities.js +140 -140
  49. data/client-app/app/models/message-collection.js +178 -178
  50. data/client-app/app/models/message.js +100 -100
  51. data/client-app/app/resolver.js +3 -3
  52. data/client-app/app/router.js +14 -14
  53. data/client-app/app/routes/index.js +57 -57
  54. data/client-app/app/routes/show.js +14 -14
  55. data/client-app/app/styles/app.css +521 -521
  56. data/client-app/app/templates/application.hbs +2 -2
  57. data/client-app/app/templates/components/actions-menu.hbs +12 -12
  58. data/client-app/app/templates/components/env-tab.hbs +10 -10
  59. data/client-app/app/templates/components/message-info.hbs +41 -41
  60. data/client-app/app/templates/components/message-row.hbs +15 -15
  61. data/client-app/app/templates/components/panel-resizer.hbs +3 -3
  62. data/client-app/app/templates/components/tabbed-section.hbs +10 -10
  63. data/client-app/app/templates/components/time-formatter.hbs +1 -1
  64. data/client-app/app/templates/index.hbs +58 -58
  65. data/client-app/app/templates/show.hbs +7 -7
  66. data/client-app/config/environment.js +51 -51
  67. data/client-app/config/optional-features.json +3 -3
  68. data/client-app/config/targets.js +18 -18
  69. data/client-app/ember-cli-build.js +29 -29
  70. data/client-app/package-lock.json +11365 -11365
  71. data/client-app/package.json +56 -56
  72. data/client-app/testem.js +25 -25
  73. data/client-app/tests/index.html +34 -34
  74. data/client-app/tests/integration/components/actions-menu-test.js +26 -26
  75. data/client-app/tests/integration/components/env-tab-test.js +73 -73
  76. data/client-app/tests/integration/components/message-info-test.js +26 -26
  77. data/client-app/tests/integration/components/message-row-test.js +26 -26
  78. data/client-app/tests/integration/components/panel-resizer-test.js +26 -26
  79. data/client-app/tests/integration/components/tab-contents-test.js +26 -26
  80. data/client-app/tests/integration/components/tab-link-test.js +26 -26
  81. data/client-app/tests/integration/components/tabbed-section-test.js +26 -26
  82. data/client-app/tests/integration/components/time-formatter-test.js +26 -26
  83. data/client-app/tests/integration/components/update-time-test.js +26 -26
  84. data/client-app/tests/test-helper.js +8 -8
  85. data/client-app/tests/unit/controllers/index-test.js +12 -12
  86. data/client-app/tests/unit/controllers/show-test.js +12 -12
  87. data/client-app/tests/unit/initializers/app-init-test.js +31 -31
  88. data/client-app/tests/unit/routes/index-test.js +11 -11
  89. data/client-app/tests/unit/routes/show-test.js +11 -11
  90. data/lib/examples/sidekiq_logster_reporter.rb +21 -21
  91. data/lib/logster.rb +54 -54
  92. data/lib/logster/base_store.rb +141 -141
  93. data/lib/logster/configuration.rb +25 -25
  94. data/lib/logster/defer_logger.rb +14 -14
  95. data/lib/logster/ignore_pattern.rb +65 -65
  96. data/lib/logster/logger.rb +113 -113
  97. data/lib/logster/message.rb +212 -212
  98. data/lib/logster/middleware/debug_exceptions.rb +26 -26
  99. data/lib/logster/middleware/reporter.rb +55 -55
  100. data/lib/logster/middleware/viewer.rb +221 -221
  101. data/lib/logster/rails/railtie.rb +63 -63
  102. data/lib/logster/redis_store.rb +566 -566
  103. data/lib/logster/scheduler.rb +54 -40
  104. data/lib/logster/version.rb +3 -3
  105. data/lib/logster/web.rb +14 -14
  106. data/logster.gemspec +35 -35
  107. data/test/examples/test_sidekiq_reporter_example.rb +46 -46
  108. data/test/fake_data/Gemfile +4 -4
  109. data/test/fake_data/generate.rb +10 -10
  110. data/test/logster/middleware/test_reporter.rb +19 -19
  111. data/test/logster/middleware/test_viewer.rb +96 -96
  112. data/test/logster/test_base_store.rb +147 -147
  113. data/test/logster/test_defer_logger.rb +34 -34
  114. data/test/logster/test_ignore_pattern.rb +41 -41
  115. data/test/logster/test_logger.rb +86 -86
  116. data/test/logster/test_message.rb +119 -119
  117. data/test/logster/test_redis_rate_limiter.rb +230 -230
  118. data/test/logster/test_redis_store.rb +720 -720
  119. data/test/test_helper.rb +38 -38
  120. data/vendor/assets/javascripts/logster.js.erb +39 -39
  121. metadata +2 -2
@@ -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(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.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(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.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,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,57 +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
- this.events.on("panelResized", amount => {
50
- controller.resizePanels(amount);
51
- });
52
- },
53
-
54
- deactivate() {
55
- clearInterval(this.refreshInterval);
56
- }
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
+ 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,521 +1,521 @@
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
- }
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
+ }