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,27 +1,27 @@
1
- import Component from "@ember/component";
2
-
3
- export default Component.extend({
4
- classNameBindings: ["active", ":content"],
5
- isLink: false,
6
-
7
- invokeParent(name) {
8
- let current = this.get("parentView");
9
- while (current && !current[name]) {
10
- current = current.get("parentView");
11
- }
12
- if (current) {
13
- current[name](this);
14
- }
15
- },
16
-
17
- didInsertElement() {
18
- this.invokeParent("addTab");
19
- if (this.get("defaultTab")) {
20
- this.invokeParent("selectTab");
21
- }
22
- },
23
-
24
- willDestroyElement() {
25
- this.invokeParent("removeTab");
26
- }
27
- });
1
+ import Component from "@ember/component";
2
+
3
+ export default Component.extend({
4
+ classNameBindings: ["active", ":content"],
5
+ isLink: false,
6
+
7
+ invokeParent(name) {
8
+ let current = this.get("parentView");
9
+ while (current && !current[name]) {
10
+ current = current.get("parentView");
11
+ }
12
+ if (current) {
13
+ current[name](this);
14
+ }
15
+ },
16
+
17
+ didInsertElement() {
18
+ this.invokeParent("addTab");
19
+ if (this.get("defaultTab")) {
20
+ this.invokeParent("selectTab");
21
+ }
22
+ },
23
+
24
+ willDestroyElement() {
25
+ this.invokeParent("removeTab");
26
+ }
27
+ });
@@ -1,5 +1,5 @@
1
- import Component from "@ember/component";
2
-
3
- export default Component.extend({
4
- isLink: true
5
- });
1
+ import Component from "@ember/component";
2
+
3
+ export default Component.extend({
4
+ isLink: true
5
+ });
@@ -1,32 +1,32 @@
1
- import Component from "@ember/component";
2
-
3
- export default Component.extend({
4
- tabs: Em.A(),
5
- selectTab(view) {
6
- if (view.get("isLink")) {
7
- this.triggerAction(view.get("action"));
8
- return;
9
- }
10
-
11
- const selected = this.get("selected");
12
- if (selected) {
13
- selected.set("active", false);
14
- }
15
- this.set("selected", view);
16
- view.set("active", true);
17
- },
18
-
19
- addTab(tab) {
20
- this.get("tabs").addObject(tab);
21
- if (!this.get("selected") && !tab.get("isLink")) {
22
- this.selectTab(tab);
23
- }
24
- },
25
-
26
- removeTab(tab) {
27
- if (this.get("selected") === tab) {
28
- this.set("selected", null);
29
- }
30
- this.get("tabs").removeObject(tab);
31
- }
32
- });
1
+ import Component from "@ember/component";
2
+
3
+ export default Component.extend({
4
+ tabs: Em.A(),
5
+ selectTab(view) {
6
+ if (view.get("isLink")) {
7
+ this.triggerAction(view.get("action"));
8
+ return;
9
+ }
10
+
11
+ const selected = this.get("selected");
12
+ if (selected) {
13
+ selected.set("active", false);
14
+ }
15
+ this.set("selected", view);
16
+ view.set("active", true);
17
+ },
18
+
19
+ addTab(tab) {
20
+ this.get("tabs").addObject(tab);
21
+ if (!this.get("selected") && !tab.get("isLink")) {
22
+ this.selectTab(tab);
23
+ }
24
+ },
25
+
26
+ removeTab(tab) {
27
+ if (this.get("selected") === tab) {
28
+ this.set("selected", null);
29
+ }
30
+ this.get("tabs").removeObject(tab);
31
+ }
32
+ });
@@ -1,25 +1,25 @@
1
- import Component from "@ember/component";
2
- import { formatTime } from "client-app/lib/utilities";
3
- import { computed } from "@ember/object";
4
-
5
- export default Component.extend({
6
- tagName: "span",
7
- classNames: "auto-update-time",
8
- attributeBindings: ["dataTimestamp:data-timestamp", "title"],
9
-
10
- title: computed(function() {
11
- return this.get("moment").format();
12
- }),
13
-
14
- dataTimestamp: computed(function() {
15
- return this.get("timestamp");
16
- }),
17
-
18
- moment: computed(function() {
19
- return moment(this.get("timestamp"));
20
- }),
21
-
22
- time: computed("timestamp", function() {
23
- return formatTime(this.get("timestamp"));
24
- })
25
- });
1
+ import Component from "@ember/component";
2
+ import { formatTime } from "client-app/lib/utilities";
3
+ import { computed } from "@ember/object";
4
+
5
+ export default Component.extend({
6
+ tagName: "span",
7
+ classNames: "auto-update-time",
8
+ attributeBindings: ["dataTimestamp:data-timestamp", "title"],
9
+
10
+ title: computed(function() {
11
+ return this.get("moment").format();
12
+ }),
13
+
14
+ dataTimestamp: computed(function() {
15
+ return this.get("timestamp");
16
+ }),
17
+
18
+ moment: computed(function() {
19
+ return moment(this.get("timestamp"));
20
+ }),
21
+
22
+ time: computed("timestamp", function() {
23
+ return formatTime(this.get("timestamp"));
24
+ })
25
+ });
@@ -1,21 +1,21 @@
1
- import Component from "@ember/component";
2
- import { formatTime } from "client-app/lib/utilities";
3
-
4
- export default Component.extend({
5
- didInsertElement() {
6
- const updateTimes = () => {
7
- Em.$(".auto-update-time").each(function() {
8
- const timestamp = parseInt(this.getAttribute("data-timestamp"), 10);
9
- const elem = this;
10
- const text = formatTime(timestamp);
11
-
12
- if (text !== elem.innerText) {
13
- elem.innerText = text;
14
- }
15
- });
16
- Em.run.later(updateTimes, 60000);
17
- };
18
-
19
- Em.run.later(updateTimes, 60000);
20
- }
21
- });
1
+ import Component from "@ember/component";
2
+ import { formatTime } from "client-app/lib/utilities";
3
+
4
+ export default Component.extend({
5
+ didInsertElement() {
6
+ const updateTimes = () => {
7
+ Em.$(".auto-update-time").each(function() {
8
+ const timestamp = parseInt(this.getAttribute("data-timestamp"), 10);
9
+ const elem = this;
10
+ const text = formatTime(timestamp);
11
+
12
+ if (text !== elem.innerText) {
13
+ elem.innerText = text;
14
+ }
15
+ });
16
+ Em.run.later(updateTimes, 60000);
17
+ };
18
+
19
+ Em.run.later(updateTimes, 60000);
20
+ }
21
+ });
@@ -1,83 +1,92 @@
1
- import Controller from "@ember/controller";
2
- import { ajax } from "client-app/lib/utilities";
3
- import { observer } from "@ember/object";
4
-
5
- export default Controller.extend({
6
- currentMessage: Em.computed.alias("model.currentMessage"),
7
-
8
- actions: {
9
- expandMessage(message) {
10
- message.expand();
11
- },
12
-
13
- selectMessage(message) {
14
- const old = this.get("currentMessage");
15
- if (old) {
16
- old.set("selected", false);
17
- }
18
-
19
- message.set("selected", true);
20
- this.set("currentMessage", message);
21
- },
22
-
23
- showMoreBefore() {
24
- this.get("model").showMoreBefore();
25
- },
26
-
27
- loadMore() {
28
- return this.get("model").loadMore();
29
- },
30
-
31
- clear() {
32
- if (confirm("Clear the logs?\n\nCancel = No, OK = Clear")) {
33
- ajax("/clear", { type: "POST" }).then(() => {
34
- this.get("model").reload();
35
- });
36
- }
37
- },
38
-
39
- removeMessage(msg) {
40
- const messages = this.get("model");
41
- messages.destroy(msg);
42
- },
43
-
44
- solveMessage(msg) {
45
- const messages = this.get("model");
46
- messages.solve(msg);
47
- }
48
- },
49
-
50
- filterChanged: observer(
51
- "showDebug",
52
- "showInfo",
53
- "showWarn",
54
- "showErr",
55
- "showFatal",
56
- function() {
57
- const filter = [];
58
- ["Debug", "Info", "Warn", "Err", "Fatal"].forEach((severity, index) => {
59
- if (this.get(`show${severity}`)) {
60
- filter.push(index);
61
- }
62
- });
63
-
64
- // always show unknown, rare
65
- filter.push(5);
66
- const model = this.get("model");
67
- model.set("filter", filter);
68
- if (this.get("initialized")) {
69
- model.reload();
70
- }
71
- }
72
- ),
73
-
74
- searchChanged: observer("search", function() {
75
- const search = this.get("search");
76
- const model = this.get("model");
77
- model.set("search", search);
78
-
79
- if (this.get("initialized")) {
80
- model.reload();
81
- }
82
- })
83
- });
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 - 10);
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
+ filterChanged: observer(
60
+ "showDebug",
61
+ "showInfo",
62
+ "showWarn",
63
+ "showErr",
64
+ "showFatal",
65
+ function() {
66
+ const filter = [];
67
+ ["Debug", "Info", "Warn", "Err", "Fatal"].forEach((severity, index) => {
68
+ if (this.get(`show${severity}`)) {
69
+ filter.push(index);
70
+ }
71
+ });
72
+
73
+ // always show unknown, rare
74
+ filter.push(5);
75
+ const model = this.get("model");
76
+ model.set("filter", filter);
77
+ if (this.get("initialized")) {
78
+ model.reload();
79
+ }
80
+ }
81
+ ),
82
+
83
+ searchChanged: observer("search", function() {
84
+ const search = this.get("search");
85
+ const model = this.get("model");
86
+ model.set("search", search);
87
+
88
+ if (this.get("initialized")) {
89
+ model.reload();
90
+ }
91
+ })
92
+ });
@@ -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, initial-scale=1">
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>