logster 2.1.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,105 +1,105 @@
1
- import Controller from "@ember/controller";
2
- import { ajax } from "client-app/lib/utilities";
3
- import { observer, computed } from "@ember/object";
4
-
5
- export default Controller.extend({
6
- currentMessage: Em.computed.alias("model.currentMessage"),
7
-
8
- resizePanels(amount) {
9
- Em.$("#bottom-panel").css("height", amount - 13);
10
- Em.$("#top-panel").css("bottom", amount + 12);
11
- },
12
-
13
- actionsInMenu: computed(function() {
14
- return this.site.isMobile;
15
- }),
16
-
17
- actions: {
18
- expandMessage(message) {
19
- message.expand();
20
- },
21
-
22
- selectMessage(message) {
23
- const old = this.get("currentMessage");
24
- if (old) {
25
- old.set("selected", false);
26
- }
27
-
28
- message.set("selected", true);
29
- this.set("currentMessage", message);
30
- },
31
-
32
- showMoreBefore() {
33
- this.get("model").showMoreBefore();
34
- },
35
-
36
- loadMore() {
37
- return this.get("model").loadMore();
38
- },
39
-
40
- clear() {
41
- if (confirm("Clear the logs?\n\nCancel = No, OK = Clear")) {
42
- ajax("/clear", { type: "POST" }).then(() => {
43
- this.get("model").reload();
44
- });
45
- }
46
- },
47
-
48
- removeMessage(msg) {
49
- const messages = this.get("model");
50
- messages.destroy(msg);
51
- },
52
-
53
- solveMessage(msg) {
54
- const messages = this.get("model");
55
- messages.solve(msg);
56
- }
57
- },
58
-
59
- updateSelectedMessage() {
60
- const currentKey = this.get("currentMessage.key");
61
- const messages = this.get("model.messages");
62
- if (currentKey && messages) {
63
- const match = messages.find(m => m.key === currentKey);
64
- if (match) {
65
- match.set("selected", true);
66
- } else {
67
- this.set("currentMessage", null);
68
- }
69
- }
70
- },
71
-
72
- filterChanged: observer(
73
- "showDebug",
74
- "showInfo",
75
- "showWarn",
76
- "showErr",
77
- "showFatal",
78
- function() {
79
- const filter = [];
80
- ["Debug", "Info", "Warn", "Err", "Fatal"].forEach((severity, index) => {
81
- if (this.get(`show${severity}`)) {
82
- filter.push(index);
83
- }
84
- });
85
-
86
- // always show unknown, rare
87
- filter.push(5);
88
- const model = this.get("model");
89
- model.set("filter", filter);
90
- if (this.get("initialized")) {
91
- model.reload().then(() => this.updateSelectedMessage());
92
- }
93
- }
94
- ),
95
-
96
- searchChanged: observer("search", function() {
97
- const search = this.get("search");
98
- const model = this.get("model");
99
- model.set("search", search);
100
-
101
- if (this.get("initialized")) {
102
- model.reload().then(() => this.updateSelectedMessage());
103
- }
104
- })
105
- });
1
+ import Controller from "@ember/controller";
2
+ import { ajax } from "client-app/lib/utilities";
3
+ import { observer, computed } from "@ember/object";
4
+
5
+ export default Controller.extend({
6
+ currentMessage: Em.computed.alias("model.currentMessage"),
7
+
8
+ resizePanels(amount) {
9
+ Em.$("#bottom-panel").css("height", amount - 13);
10
+ Em.$("#top-panel").css("bottom", amount + 12);
11
+ },
12
+
13
+ actionsInMenu: computed(function() {
14
+ return this.site.isMobile;
15
+ }),
16
+
17
+ actions: {
18
+ expandMessage(message) {
19
+ message.expand();
20
+ },
21
+
22
+ selectMessage(message) {
23
+ const old = this.get("currentMessage");
24
+ if (old) {
25
+ old.set("selected", false);
26
+ }
27
+
28
+ message.set("selected", true);
29
+ this.set("currentMessage", message);
30
+ },
31
+
32
+ showMoreBefore() {
33
+ this.get("model").showMoreBefore();
34
+ },
35
+
36
+ loadMore() {
37
+ return this.get("model").loadMore();
38
+ },
39
+
40
+ clear() {
41
+ if (confirm("Clear the logs?\n\nCancel = No, OK = Clear")) {
42
+ ajax("/clear", { type: "POST" }).then(() => {
43
+ this.get("model").reload();
44
+ });
45
+ }
46
+ },
47
+
48
+ removeMessage(msg) {
49
+ const messages = this.get("model");
50
+ messages.destroy(msg);
51
+ },
52
+
53
+ solveMessage(msg) {
54
+ const messages = this.get("model");
55
+ messages.solve(msg);
56
+ }
57
+ },
58
+
59
+ updateSelectedMessage() {
60
+ const currentKey = this.get("currentMessage.key");
61
+ const messages = this.get("model.messages");
62
+ if (currentKey && messages) {
63
+ const match = messages.find(m => m.key === currentKey);
64
+ if (match) {
65
+ match.set("selected", true);
66
+ } else {
67
+ this.set("currentMessage", null);
68
+ }
69
+ }
70
+ },
71
+
72
+ filterChanged: observer(
73
+ "showDebug",
74
+ "showInfo",
75
+ "showWarn",
76
+ "showErr",
77
+ "showFatal",
78
+ function() {
79
+ const filter = [];
80
+ ["Debug", "Info", "Warn", "Err", "Fatal"].forEach((severity, index) => {
81
+ if (this.get(`show${severity}`)) {
82
+ filter.push(index);
83
+ }
84
+ });
85
+
86
+ // always show unknown, rare
87
+ filter.push(5);
88
+ const model = this.get("model");
89
+ model.set("filter", filter);
90
+ if (this.get("initialized")) {
91
+ model.reload().then(() => this.updateSelectedMessage());
92
+ }
93
+ }
94
+ ),
95
+
96
+ searchChanged: observer("search", function() {
97
+ const search = this.get("search");
98
+ const model = this.get("model");
99
+ model.set("search", search);
100
+
101
+ if (this.get("initialized")) {
102
+ model.reload().then(() => this.updateSelectedMessage());
103
+ }
104
+ })
105
+ });
@@ -1,13 +1,13 @@
1
- import Controller from "@ember/controller";
2
-
3
- export default Controller.extend({
4
- actions: {
5
- protect() {
6
- this.get("model").protect();
7
- },
8
-
9
- unprotect() {
10
- this.get("model").unprotect();
11
- }
12
- }
13
- });
1
+ import Controller from "@ember/controller";
2
+
3
+ export default Controller.extend({
4
+ actions: {
5
+ protect() {
6
+ this.get("model").protect();
7
+ },
8
+
9
+ unprotect() {
10
+ this.get("model").unprotect();
11
+ }
12
+ }
13
+ });
@@ -1,29 +1,29 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8">
5
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
- <title>ClientApp</title>
7
- <meta name="description" content="">
8
- <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=yes">
9
- <meta id="preloaded-data" data-root-path="/logs" data-preloaded="{}">
10
-
11
- {{content-for "head"}}
12
-
13
- <link integrity="" rel="stylesheet" href="{{rootURL}}assets/vendor.css">
14
- <link integrity="" rel="stylesheet" href="{{rootURL}}assets/client-app.css">
15
-
16
- <link href='//fonts.googleapis.com/css?family=Roboto' rel='stylesheet' type='text/css'>
17
- <link href='//fonts.googleapis.com/css?family=Roboto+Mono' rel='stylesheet' type='text/css'>
18
-
19
- {{content-for "head-footer"}}
20
- </head>
21
- <body>
22
- {{content-for "body"}}
23
-
24
- <script src="{{rootURL}}assets/vendor.js"></script>
25
- <script src="{{rootURL}}assets/client-app.js"></script>
26
-
27
- {{content-for "body-footer"}}
28
- </body>
29
- </html>
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <title>ClientApp</title>
7
+ <meta name="description" content="">
8
+ <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=yes">
9
+ <meta id="preloaded-data" data-root-path="/logs" data-preloaded="{}">
10
+
11
+ {{content-for "head"}}
12
+
13
+ <link integrity="" rel="stylesheet" href="{{rootURL}}assets/vendor.css">
14
+ <link integrity="" rel="stylesheet" href="{{rootURL}}assets/client-app.css">
15
+
16
+ <link href='//fonts.googleapis.com/css?family=Roboto' rel='stylesheet' type='text/css'>
17
+ <link href='//fonts.googleapis.com/css?family=Roboto+Mono' rel='stylesheet' type='text/css'>
18
+
19
+ {{content-for "head-footer"}}
20
+ </head>
21
+ <body>
22
+ {{content-for "body"}}
23
+
24
+ <script src="{{rootURL}}assets/vendor.js"></script>
25
+ <script src="{{rootURL}}assets/client-app.js"></script>
26
+
27
+ {{content-for "body-footer"}}
28
+ </body>
29
+ </html>
@@ -1,72 +1,72 @@
1
- import {
2
- updateHiddenProperty,
3
- resetTitleCount
4
- } from "client-app/lib/utilities";
5
- import { init } from "client-app/lib/preload";
6
- import Evented from "@ember/object/evented";
7
- import EmberObject from "@ember/object";
8
-
9
- const TARGETS = ["component", "route"];
10
-
11
- export function initialize(app) {
12
- // config for moment.js
13
- moment.updateLocale("en", {
14
- relativeTime: {
15
- future: "in %s",
16
- past: "%s ago",
17
- s: "secs",
18
- m: "a min",
19
- mm: "%d mins",
20
- h: "an hr",
21
- hh: "%d hrs",
22
- d: "a day",
23
- dd: "%d days",
24
- M: "a mth",
25
- MM: "%d mths",
26
- y: "a yr",
27
- yy: "%d yrs"
28
- }
29
- });
30
-
31
- // parse preloaded json
32
- const dataset = document.getElementById("preloaded-data").dataset;
33
- init(dataset);
34
-
35
- // setup event for updating document title and title count
36
- let hiddenProperty;
37
- let visibilitychange;
38
-
39
- ["", "webkit", "ms", "moz", "ms"].forEach(prefix => {
40
- const check = prefix + (prefix === "" ? "hidden" : "Hidden");
41
- if (document[check] !== undefined && !hiddenProperty) {
42
- hiddenProperty = check;
43
- visibilitychange = prefix + "visibilitychange";
44
- }
45
- });
46
-
47
- updateHiddenProperty(hiddenProperty);
48
- document.addEventListener(
49
- visibilitychange,
50
- () => {
51
- resetTitleCount();
52
- },
53
- false
54
- );
55
-
56
- app.register("events:main", EmberObject.extend(Evented).create(), {
57
- instantiate: false
58
- });
59
- TARGETS.forEach(t => app.inject(t, "events", "events:main"));
60
-
61
- const isMobile =
62
- /mobile/i.test(navigator.userAgent) && !/iPad/.test(navigator.userAgent);
63
- if (isMobile) {
64
- Em.$("body").addClass("mobile");
65
- }
66
- app.register("site:main", { isMobile }, { instantiate: false });
67
- app.inject("controller", "site", "site:main");
68
- }
69
-
70
- export default {
71
- initialize
72
- };
1
+ import {
2
+ updateHiddenProperty,
3
+ resetTitleCount
4
+ } from "client-app/lib/utilities";
5
+ import { init } from "client-app/lib/preload";
6
+ import Evented from "@ember/object/evented";
7
+ import EmberObject from "@ember/object";
8
+
9
+ const TARGETS = ["component", "route"];
10
+
11
+ export function initialize(app) {
12
+ // config for moment.js
13
+ moment.updateLocale("en", {
14
+ relativeTime: {
15
+ future: "in %s",
16
+ past: "%s ago",
17
+ s: "secs",
18
+ m: "a min",
19
+ mm: "%d mins",
20
+ h: "an hr",
21
+ hh: "%d hrs",
22
+ d: "a day",
23
+ dd: "%d days",
24
+ M: "a mth",
25
+ MM: "%d mths",
26
+ y: "a yr",
27
+ yy: "%d yrs"
28
+ }
29
+ });
30
+
31
+ // parse preloaded json
32
+ const dataset = document.getElementById("preloaded-data").dataset;
33
+ init(dataset);
34
+
35
+ // setup event for updating document title and title count
36
+ let hiddenProperty;
37
+ let visibilitychange;
38
+
39
+ ["", "webkit", "ms", "moz", "ms"].forEach(prefix => {
40
+ const check = prefix + (prefix === "" ? "hidden" : "Hidden");
41
+ if (document[check] !== undefined && !hiddenProperty) {
42
+ hiddenProperty = check;
43
+ visibilitychange = prefix + "visibilitychange";
44
+ }
45
+ });
46
+
47
+ updateHiddenProperty(hiddenProperty);
48
+ document.addEventListener(
49
+ visibilitychange,
50
+ () => {
51
+ resetTitleCount();
52
+ },
53
+ false
54
+ );
55
+
56
+ app.register("events:main", EmberObject.extend(Evented).create(), {
57
+ instantiate: false
58
+ });
59
+ TARGETS.forEach(t => app.inject(t, "events", "events:main"));
60
+
61
+ const isMobile =
62
+ /mobile/i.test(navigator.userAgent) && !/iPad/.test(navigator.userAgent);
63
+ if (isMobile) {
64
+ Em.$("body").addClass("mobile");
65
+ }
66
+ app.register("site:main", { isMobile }, { instantiate: false });
67
+ app.inject("controller", "site", "site:main");
68
+ }
69
+
70
+ export default {
71
+ initialize
72
+ };
@@ -1,14 +1,14 @@
1
- let CONTAINER;
2
-
3
- export function init(dataset) {
4
- CONTAINER = {
5
- rootPath: dataset.rootPath,
6
- preload: JSON.parse(dataset.preloaded)
7
- };
8
- }
9
-
10
- export default {
11
- get(key) {
12
- return Em.get(CONTAINER, key);
13
- }
14
- };
1
+ let CONTAINER;
2
+
3
+ export function init(dataset) {
4
+ CONTAINER = {
5
+ rootPath: dataset.rootPath,
6
+ preload: JSON.parse(dataset.preloaded)
7
+ };
8
+ }
9
+
10
+ export default {
11
+ get(key) {
12
+ return Em.get(CONTAINER, key);
13
+ }
14
+ };