logster 1.2.11 → 1.3.pre

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 (126) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +18 -17
  3. data/.travis.yml +15 -16
  4. data/CHANGELOG.md +130 -130
  5. data/Gemfile +4 -4
  6. data/Guardfile +8 -8
  7. data/LICENSE.txt +22 -22
  8. data/README.md +99 -96
  9. data/Rakefile +24 -23
  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 +81 -0
  21. data/assets/javascript/vendor.js +5302 -0
  22. data/assets/stylesheets/client-app.css +1 -0
  23. data/assets/stylesheets/vendor.css +4 -0
  24. data/build_client_app.sh +12 -0
  25. data/client-app/.editorconfig +20 -0
  26. data/client-app/.ember-cli +9 -0
  27. data/client-app/.eslintignore +19 -0
  28. data/client-app/.eslintrc.js +46 -0
  29. data/client-app/.gitignore +23 -0
  30. data/client-app/.travis.yml +27 -0
  31. data/client-app/.watchmanconfig +3 -0
  32. data/client-app/README.md +57 -0
  33. data/client-app/app/app.js +14 -0
  34. data/client-app/app/components/message-info.js +18 -0
  35. data/client-app/app/components/message-row.js +45 -0
  36. data/client-app/app/components/panel-resizer.js +75 -0
  37. data/client-app/app/components/tab-contents.js +27 -0
  38. data/client-app/app/components/tab-link.js +5 -0
  39. data/client-app/app/components/tabbed-section.js +32 -0
  40. data/client-app/app/components/time-formatter.js +25 -0
  41. data/client-app/app/components/update-time.js +21 -0
  42. data/client-app/app/controllers/index.js +83 -0
  43. data/client-app/app/controllers/show.js +13 -0
  44. data/client-app/app/index.html +29 -0
  45. data/client-app/app/initializers/app-init.js +55 -0
  46. data/client-app/app/lib/preload.js +14 -0
  47. data/client-app/app/lib/utilities.js +140 -0
  48. data/client-app/app/models/message-collection.js +158 -0
  49. data/client-app/app/models/message.js +99 -0
  50. data/client-app/app/resolver.js +3 -0
  51. data/client-app/app/router.js +14 -0
  52. data/client-app/app/routes/index.js +53 -0
  53. data/client-app/app/routes/show.js +14 -0
  54. data/{assets/stylesheets → client-app/app/styles}/app.css +387 -390
  55. data/{assets/javascript → client-app/app}/templates/application.hbs +2 -2
  56. data/client-app/app/templates/components/message-info.hbs +44 -0
  57. data/{assets/javascript → client-app/app/templates}/components/message-row.hbs +17 -17
  58. data/client-app/app/templates/components/tabbed-section.hbs +10 -0
  59. data/client-app/app/templates/components/time-formatter.hbs +1 -0
  60. data/{assets/javascript → client-app/app}/templates/index.hbs +57 -57
  61. data/{assets/javascript → client-app/app}/templates/show.hbs +4 -4
  62. data/client-app/config/environment.js +51 -0
  63. data/client-app/config/optional-features.json +3 -0
  64. data/client-app/config/targets.js +18 -0
  65. data/client-app/ember-cli-build.js +29 -0
  66. data/client-app/package-lock.json +11365 -0
  67. data/client-app/package.json +56 -0
  68. data/client-app/testem.js +25 -0
  69. data/client-app/tests/index.html +34 -0
  70. data/client-app/tests/integration/components/message-info-test.js +26 -0
  71. data/client-app/tests/integration/components/message-row-test.js +26 -0
  72. data/client-app/tests/integration/components/panel-resizer-test.js +26 -0
  73. data/client-app/tests/integration/components/tab-contents-test.js +26 -0
  74. data/client-app/tests/integration/components/tab-link-test.js +26 -0
  75. data/client-app/tests/integration/components/tabbed-section-test.js +26 -0
  76. data/client-app/tests/integration/components/time-formatter-test.js +26 -0
  77. data/client-app/tests/integration/components/update-time-test.js +26 -0
  78. data/client-app/tests/test-helper.js +8 -0
  79. data/client-app/tests/unit/controllers/index-test.js +12 -0
  80. data/client-app/tests/unit/controllers/show-test.js +12 -0
  81. data/client-app/tests/unit/initializers/app-init-test.js +31 -0
  82. data/client-app/tests/unit/routes/index-test.js +11 -0
  83. data/client-app/tests/unit/routes/show-test.js +11 -0
  84. data/lib/examples/sidekiq_logster_reporter.rb +21 -21
  85. data/lib/logster.rb +54 -54
  86. data/lib/logster/base_store.rb +130 -130
  87. data/lib/logster/configuration.rb +25 -25
  88. data/lib/logster/ignore_pattern.rb +65 -65
  89. data/lib/logster/logger.rb +102 -101
  90. data/lib/logster/message.rb +227 -226
  91. data/lib/logster/middleware/debug_exceptions.rb +26 -26
  92. data/lib/logster/middleware/reporter.rb +56 -54
  93. data/lib/logster/middleware/viewer.rb +220 -251
  94. data/lib/logster/rails/railtie.rb +58 -58
  95. data/lib/logster/redis_store.rb +481 -477
  96. data/lib/logster/version.rb +3 -3
  97. data/lib/logster/web.rb +14 -14
  98. data/logster.gemspec +34 -33
  99. data/test/examples/test_sidekiq_reporter_example.rb +46 -46
  100. data/test/fake_data/Gemfile +4 -4
  101. data/test/fake_data/generate.rb +10 -10
  102. data/test/logster/middleware/test_reporter.rb +21 -21
  103. data/test/logster/middleware/test_viewer.rb +96 -70
  104. data/test/logster/test_base_store.rb +147 -147
  105. data/test/logster/test_ignore_pattern.rb +41 -41
  106. data/test/logster/test_logger.rb +74 -74
  107. data/test/logster/test_message.rb +34 -34
  108. data/test/logster/test_redis_rate_limiter.rb +230 -230
  109. data/test/logster/test_redis_store.rb +427 -414
  110. data/test/test_helper.rb +38 -37
  111. data/vendor/assets/javascripts/logster.js.erb +39 -39
  112. metadata +83 -24
  113. data/assets/javascript/app.js +0 -817
  114. data/assets/javascript/components/message-info.hbs +0 -47
  115. data/assets/javascript/components/panel-resizer.hbs +0 -0
  116. data/assets/javascript/components/tab-contents.hbs +0 -1
  117. data/assets/javascript/components/tab-link.hbs +0 -1
  118. data/assets/javascript/components/tabbed-section.hbs +0 -6
  119. data/assets/javascript/external/ember-template-compiler.js +0 -22346
  120. data/assets/javascript/external/ember.js +0 -58500
  121. data/assets/javascript/external/ember.min.js +0 -17
  122. data/assets/javascript/external/jquery.min.js +0 -5
  123. data/assets/javascript/external/lodash.min.js +0 -87
  124. data/assets/javascript/external/moment.min.js +0 -6
  125. data/assets/stylesheets/font-awesome.min.css +0 -4
  126. data/bower.json +0 -25
@@ -1,54 +1,54 @@
1
- require 'logster/logger'
2
- require 'logster/message'
3
- require 'logster/configuration'
4
- require 'logster/web'
5
- require 'logster/ignore_pattern'
6
-
7
- if defined? Redis
8
- require 'logster/redis_store'
9
- else
10
- STDERR.puts "ERROR: Redis is not loaded, ensure redis gem is required before logster"
11
- exit
12
- end
13
-
14
- module Logster
15
- def self.logger=(logger)
16
- @logger = logger
17
- end
18
-
19
- def self.logger
20
- @logger
21
- end
22
-
23
- def self.store=(store)
24
- @store=store
25
- end
26
-
27
- def self.store
28
- @store
29
- end
30
-
31
- def self.config=(config)
32
- @config = config
33
- end
34
-
35
- def self.config
36
- @config ||= Configuration.new
37
- end
38
-
39
- def self.add_to_env(env, key, value)
40
- logster_env = Logster::Message.populate_from_env(env)
41
- logster_env[key] = value
42
- end
43
-
44
- def self.set_environments(envs)
45
- config.environments = envs
46
- end
47
- end
48
-
49
- # check logster/configuration.rb for config options
50
- # Logster.config.environments << :staging
51
-
52
- if defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i >= 3
53
- require 'logster/rails/railtie'
54
- end
1
+ require 'logster/logger'
2
+ require 'logster/message'
3
+ require 'logster/configuration'
4
+ require 'logster/web'
5
+ require 'logster/ignore_pattern'
6
+
7
+ if defined? Redis
8
+ require 'logster/redis_store'
9
+ else
10
+ STDERR.puts "ERROR: Redis is not loaded, ensure redis gem is required before logster"
11
+ exit
12
+ end
13
+
14
+ module Logster
15
+ def self.logger=(logger)
16
+ @logger = logger
17
+ end
18
+
19
+ def self.logger
20
+ @logger
21
+ end
22
+
23
+ def self.store=(store)
24
+ @store=store
25
+ end
26
+
27
+ def self.store
28
+ @store
29
+ end
30
+
31
+ def self.config=(config)
32
+ @config = config
33
+ end
34
+
35
+ def self.config
36
+ @config ||= Configuration.new
37
+ end
38
+
39
+ def self.add_to_env(env, key, value)
40
+ logster_env = Logster::Message.populate_from_env(env)
41
+ logster_env[key] = value
42
+ end
43
+
44
+ def self.set_environments(envs)
45
+ config.environments = envs
46
+ end
47
+ end
48
+
49
+ # check logster/configuration.rb for config options
50
+ # Logster.config.environments << :staging
51
+
52
+ if defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i >= 3
53
+ require 'logster/rails/railtie'
54
+ end
@@ -1,130 +1,130 @@
1
-
2
- module Logster
3
- class BaseStore
4
-
5
- attr_accessor :level, :max_retention, :skip_empty, :ignore
6
-
7
- def initialize
8
- @max_retention = 60 * 60 * 24 * 7
9
- @skip_empty = true
10
- end
11
-
12
- # Save a new message at the front of the latest list.
13
- def save(message)
14
- not_implemented
15
- end
16
-
17
- # Modify the saved message to the given one (identified by message.key) and bump it to the top of the latest list
18
- def replace_and_bump(message)
19
- not_implemented
20
- end
21
-
22
- # Check if another message with the same grouping_key is already stored.
23
- # Returns the similar message's message.key
24
- def similar_key(message)
25
- not_implemented
26
- end
27
-
28
- # The number of messages currently stored.
29
- def count
30
- not_implemented
31
- end
32
-
33
- # Delete all unprotected messages in the store.
34
- def clear
35
- not_implemented
36
- end
37
-
38
- # Delete all messages, including protected messages.
39
- def clear_all
40
- not_implemented
41
- end
42
-
43
- # Get a message by its message_key
44
- def get(message_key)
45
- not_implemented
46
- end
47
-
48
- # Mark a message as protected; i.e. it is not deleted by the #clear method
49
- def protect(message_key)
50
- not_implemented
51
- end
52
-
53
- def delete(message_key)
54
- not_implemented
55
- end
56
-
57
- # Clear the protected mark for a message.
58
- def unprotect(message_key)
59
- not_implemented
60
- end
61
-
62
- # Solve a particular message, causing all old messages with matching version and backtrace
63
- # to be deleted (report should delete any solved messages when called)
64
- def solve(message_key)
65
- not_implemented
66
- end
67
-
68
- # Registers a rate limit on the given severities of logs
69
- def register_rate_limit(severities, limit, duration, &block)
70
- not_implemented
71
- end
72
-
73
- # Checks all the existing rate limiters to check if any has been exceeded
74
- def check_rate_limits(severity)
75
- not_implemented
76
- end
77
-
78
- def report(severity, progname, msg, opts = {})
79
- return if (!msg || (String === msg && msg.empty?)) && skip_empty
80
- return if level && severity < level
81
-
82
- message = Logster::Message.new(severity, progname, msg, opts[:timestamp])
83
-
84
- env = opts[:env] || {}
85
- backtrace = opts[:backtrace]
86
-
87
- if env[:backtrace]
88
- # Special - passing backtrace through env
89
- backtrace = env.delete(:backtrace)
90
- end
91
-
92
- message.populate_from_env(env)
93
-
94
- if backtrace
95
- if backtrace.respond_to? :join
96
- backtrace = backtrace.join("\n")
97
- end
98
- message.backtrace = backtrace
99
- else
100
- message.backtrace = caller.join("\n")
101
- end
102
-
103
- return if ignore && ignore.any? { |pattern| message =~ pattern}
104
-
105
- similar = nil
106
-
107
- if Logster.config.allow_grouping
108
- key = self.similar_key(message)
109
- similar = get key if key
110
- end
111
-
112
- if similar
113
- similar.count += 1
114
- similar.merge_similar_message(message)
115
-
116
- replace_and_bump similar
117
- similar
118
- else
119
- save message
120
- message
121
- end
122
- end
123
-
124
- private
125
-
126
- def not_implemented
127
- raise "Not Implemented"
128
- end
129
- end
130
- end
1
+
2
+ module Logster
3
+ class BaseStore
4
+
5
+ attr_accessor :level, :max_retention, :skip_empty, :ignore
6
+
7
+ def initialize
8
+ @max_retention = 60 * 60 * 24 * 7
9
+ @skip_empty = true
10
+ end
11
+
12
+ # Save a new message at the front of the latest list.
13
+ def save(message)
14
+ not_implemented
15
+ end
16
+
17
+ # Modify the saved message to the given one (identified by message.key) and bump it to the top of the latest list
18
+ def replace_and_bump(message)
19
+ not_implemented
20
+ end
21
+
22
+ # Check if another message with the same grouping_key is already stored.
23
+ # Returns the similar message's message.key
24
+ def similar_key(message)
25
+ not_implemented
26
+ end
27
+
28
+ # The number of messages currently stored.
29
+ def count
30
+ not_implemented
31
+ end
32
+
33
+ # Delete all unprotected messages in the store.
34
+ def clear
35
+ not_implemented
36
+ end
37
+
38
+ # Delete all messages, including protected messages.
39
+ def clear_all
40
+ not_implemented
41
+ end
42
+
43
+ # Get a message by its message_key
44
+ def get(message_key)
45
+ not_implemented
46
+ end
47
+
48
+ # Mark a message as protected; i.e. it is not deleted by the #clear method
49
+ def protect(message_key)
50
+ not_implemented
51
+ end
52
+
53
+ def delete(message_key)
54
+ not_implemented
55
+ end
56
+
57
+ # Clear the protected mark for a message.
58
+ def unprotect(message_key)
59
+ not_implemented
60
+ end
61
+
62
+ # Solve a particular message, causing all old messages with matching version and backtrace
63
+ # to be deleted (report should delete any solved messages when called)
64
+ def solve(message_key)
65
+ not_implemented
66
+ end
67
+
68
+ # Registers a rate limit on the given severities of logs
69
+ def register_rate_limit(severities, limit, duration, &block)
70
+ not_implemented
71
+ end
72
+
73
+ # Checks all the existing rate limiters to check if any has been exceeded
74
+ def check_rate_limits(severity)
75
+ not_implemented
76
+ end
77
+
78
+ def report(severity, progname, msg, opts = {})
79
+ return if (!msg || (String === msg && msg.empty?)) && skip_empty
80
+ return if level && severity < level
81
+
82
+ message = Logster::Message.new(severity, progname, msg, opts[:timestamp])
83
+
84
+ env = opts[:env] || {}
85
+ backtrace = opts[:backtrace]
86
+
87
+ if env[:backtrace]
88
+ # Special - passing backtrace through env
89
+ backtrace = env.delete(:backtrace)
90
+ end
91
+
92
+ message.populate_from_env(env)
93
+
94
+ if backtrace
95
+ if backtrace.respond_to? :join
96
+ backtrace = backtrace.join("\n")
97
+ end
98
+ message.backtrace = backtrace
99
+ else
100
+ message.backtrace = caller.join("\n")
101
+ end
102
+
103
+ return if ignore && ignore.any? { |pattern| message =~ pattern}
104
+
105
+ similar = nil
106
+
107
+ if Logster.config.allow_grouping
108
+ key = self.similar_key(message)
109
+ similar = get key if key
110
+ end
111
+
112
+ if similar
113
+ similar.count += 1
114
+ similar.merge_similar_message(message)
115
+
116
+ replace_and_bump similar
117
+ similar
118
+ else
119
+ save message
120
+ message
121
+ end
122
+ end
123
+
124
+ private
125
+
126
+ def not_implemented
127
+ raise "Not Implemented"
128
+ end
129
+ end
130
+ end
@@ -1,25 +1,25 @@
1
- module Logster
2
- class Configuration
3
- attr_accessor :current_context, :allow_grouping, :environments,
4
- :application_version, :web_title
5
-
6
- attr_writer :subdirectory
7
-
8
- def initialize
9
- # lambda |env,block|
10
- @current_context = lambda{ |_, &block| block.call }
11
- @environments = [:development, :production]
12
- @subdirectory = nil
13
-
14
- @allow_grouping = false
15
-
16
- if defined?(::Rails) && defined?(::Rails.env) && ::Rails.env.production?
17
- @allow_grouping = true
18
- end
19
- end
20
-
21
- def subdirectory
22
- @subdirectory || '/logs'
23
- end
24
- end
25
- end
1
+ module Logster
2
+ class Configuration
3
+ attr_accessor :current_context, :allow_grouping, :environments,
4
+ :application_version, :web_title
5
+
6
+ attr_writer :subdirectory
7
+
8
+ def initialize
9
+ # lambda |env,block|
10
+ @current_context = lambda{ |_, &block| block.call }
11
+ @environments = [:development, :production]
12
+ @subdirectory = nil
13
+
14
+ @allow_grouping = false
15
+
16
+ if defined?(::Rails) && defined?(::Rails.env) && ::Rails.env.production?
17
+ @allow_grouping = true
18
+ end
19
+ end
20
+
21
+ def subdirectory
22
+ @subdirectory || '/logs'
23
+ end
24
+ end
25
+ end
@@ -1,65 +1,65 @@
1
- module Logster
2
- class IgnorePattern
3
-
4
- def initialize(message_pattern=nil, env_patterns=nil)
5
- @msg_match = message_pattern
6
- @env_match = env_patterns
7
- end
8
-
9
- def self.from_message_and_request_uri(msg, request)
10
- IgnorePattern.new(msg, {REQUEST_URI: request})
11
- end
12
-
13
- def matches?(message)
14
- if @msg_match
15
- return false unless compare(message.message, @msg_match)
16
- end
17
-
18
- if @env_match
19
- return false unless compare(message.env, @env_match)
20
- end
21
-
22
- true
23
- end
24
-
25
- def to_s
26
- "<#Logster::IgnorePattern, msg_match: #{@msg_match.inspect}, env_match: #{@env_match.inspect}>"
27
- end
28
-
29
- private
30
-
31
- def compare(message, pattern)
32
- return false unless message && pattern
33
-
34
- case pattern
35
- when Regexp
36
- message.to_s =~ pattern
37
- when String
38
- message.to_s.downcase =~ Regexp.new(pattern.downcase, Regexp::IGNORECASE)
39
- when Hash
40
- if Hash === message
41
- compare_hash(message, pattern)
42
- else
43
- false
44
- end
45
- else
46
- false
47
- end
48
- end
49
-
50
- def compare_hash(message_hash, pattern_hash)
51
- return false unless message_hash
52
- pattern_hash.each do |key, value|
53
- return false unless compare(get_indifferent(message_hash, key), value)
54
- end
55
- true
56
- end
57
-
58
- def get_indifferent(hash, key)
59
- return hash[key] if hash[key]
60
- return hash[key.to_s] if hash[key.to_s]
61
- # no key.to_sym please, memory leak in Ruby < 2.2
62
- nil
63
- end
64
- end
65
- end
1
+ module Logster
2
+ class IgnorePattern
3
+
4
+ def initialize(message_pattern=nil, env_patterns=nil)
5
+ @msg_match = message_pattern
6
+ @env_match = env_patterns
7
+ end
8
+
9
+ def self.from_message_and_request_uri(msg, request)
10
+ IgnorePattern.new(msg, {REQUEST_URI: request})
11
+ end
12
+
13
+ def matches?(message)
14
+ if @msg_match
15
+ return false unless compare(message.message, @msg_match)
16
+ end
17
+
18
+ if @env_match
19
+ return false unless compare(message.env, @env_match)
20
+ end
21
+
22
+ true
23
+ end
24
+
25
+ def to_s
26
+ "<#Logster::IgnorePattern, msg_match: #{@msg_match.inspect}, env_match: #{@env_match.inspect}>"
27
+ end
28
+
29
+ private
30
+
31
+ def compare(message, pattern)
32
+ return false unless message && pattern
33
+
34
+ case pattern
35
+ when Regexp
36
+ message.to_s =~ pattern
37
+ when String
38
+ message.to_s.downcase =~ Regexp.new(pattern.downcase, Regexp::IGNORECASE)
39
+ when Hash
40
+ if Hash === message
41
+ compare_hash(message, pattern)
42
+ else
43
+ false
44
+ end
45
+ else
46
+ false
47
+ end
48
+ end
49
+
50
+ def compare_hash(message_hash, pattern_hash)
51
+ return false unless message_hash
52
+ pattern_hash.each do |key, value|
53
+ return false unless compare(get_indifferent(message_hash, key), value)
54
+ end
55
+ true
56
+ end
57
+
58
+ def get_indifferent(hash, key)
59
+ return hash[key] if hash[key]
60
+ return hash[key.to_s] if hash[key.to_s]
61
+ # no key.to_sym please, memory leak in Ruby < 2.2
62
+ nil
63
+ end
64
+ end
65
+ end