logster 2.20.1 → 3.0.0

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 (142) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -92
  3. data/README.md +29 -14
  4. data/assets/javascript/main-B82IoCiW.js +1 -0
  5. data/assets/javascript/modules-4-12-BHA4lR2U.js +1 -0
  6. data/assets/javascript/vendor.js +11 -5260
  7. data/assets/logster-config.json +18 -0
  8. data/assets/manifest.json +23 -0
  9. data/assets/stylesheets/main-CgAFFyi8.css +1 -0
  10. data/lib/logster/configuration.rb +1 -0
  11. data/lib/logster/group.rb +2 -2
  12. data/lib/logster/message.rb +4 -4
  13. data/lib/logster/middleware/reporter.rb +34 -3
  14. data/lib/logster/middleware/viewer.rb +205 -33
  15. data/lib/logster/rails/railtie.rb +4 -20
  16. data/lib/logster/redis_store.rb +0 -2
  17. data/lib/logster/version.rb +1 -1
  18. data/lib/logster.rb +1 -1
  19. metadata +17 -186
  20. data/.github/workflows/ci.yml +0 -140
  21. data/.gitignore +0 -3
  22. data/.rubocop.yml +0 -8
  23. data/.streerc +0 -2
  24. data/Gemfile +0 -10
  25. data/Guardfile +0 -10
  26. data/Rakefile +0 -27
  27. data/assets/javascript/.gitkeep +0 -0
  28. data/assets/javascript/chunk.524.c3042190e39d148beaf9.js +0 -22
  29. data/assets/javascript/chunk.582.695dcbfb11a784b110cd.js +0 -22
  30. data/assets/javascript/chunk.747.a730c497582bb6742a6e.js +0 -579
  31. data/assets/javascript/chunk.761.64949d89942c829e5c1b.js +0 -1213
  32. data/assets/javascript/client-app.js +0 -1390
  33. data/assets/stylesheets/.gitkeep +0 -0
  34. data/assets/stylesheets/client-app.css +0 -1
  35. data/assets/stylesheets/vendor.css +0 -1
  36. data/build_client_app.sh +0 -10
  37. data/client-app/.editorconfig +0 -19
  38. data/client-app/.ember-cli +0 -9
  39. data/client-app/.eslintignore +0 -20
  40. data/client-app/.eslintrc +0 -10
  41. data/client-app/.gitignore +0 -23
  42. data/client-app/.prettierignore +0 -21
  43. data/client-app/.prettierrc +0 -1
  44. data/client-app/.template-lintrc.js +0 -10
  45. data/client-app/.watchmanconfig +0 -3
  46. data/client-app/README.md +0 -56
  47. data/client-app/app/app.js +0 -12
  48. data/client-app/app/components/actions-menu.js +0 -50
  49. data/client-app/app/components/back-to-site-link.js +0 -9
  50. data/client-app/app/components/back-trace.js +0 -153
  51. data/client-app/app/components/env-tab.js +0 -68
  52. data/client-app/app/components/message-info.js +0 -151
  53. data/client-app/app/components/message-row.js +0 -46
  54. data/client-app/app/components/page-nav.js +0 -42
  55. data/client-app/app/components/panel-resizer.js +0 -108
  56. data/client-app/app/components/patterns-list.js +0 -142
  57. data/client-app/app/components/tab-contents.js +0 -23
  58. data/client-app/app/components/tabbed-section.js +0 -45
  59. data/client-app/app/components/time-formatter.js +0 -36
  60. data/client-app/app/controllers/index.js +0 -269
  61. data/client-app/app/controllers/show.js +0 -39
  62. data/client-app/app/helpers/logster-url.js +0 -12
  63. data/client-app/app/helpers/or.js +0 -7
  64. data/client-app/app/index.html +0 -31
  65. data/client-app/app/initializers/app-init.js +0 -71
  66. data/client-app/app/lib/decorators.js +0 -13
  67. data/client-app/app/lib/preload.js +0 -43
  68. data/client-app/app/lib/utilities.js +0 -230
  69. data/client-app/app/models/group.js +0 -34
  70. data/client-app/app/models/message-collection.js +0 -303
  71. data/client-app/app/models/message.js +0 -128
  72. data/client-app/app/models/pattern-item.js +0 -32
  73. data/client-app/app/resolver.js +0 -3
  74. data/client-app/app/router.js +0 -13
  75. data/client-app/app/routes/index.js +0 -64
  76. data/client-app/app/routes/settings.js +0 -32
  77. data/client-app/app/routes/show.js +0 -16
  78. data/client-app/app/services/events.js +0 -4
  79. data/client-app/app/styles/app.css +0 -829
  80. data/client-app/app/templates/application.hbs +0 -1
  81. data/client-app/app/templates/components/actions-menu.hbs +0 -31
  82. data/client-app/app/templates/components/back-to-site-link.hbs +0 -8
  83. data/client-app/app/templates/components/back-trace.hbs +0 -15
  84. data/client-app/app/templates/components/env-tab.hbs +0 -10
  85. data/client-app/app/templates/components/message-info.hbs +0 -86
  86. data/client-app/app/templates/components/message-row.hbs +0 -32
  87. data/client-app/app/templates/components/page-nav.hbs +0 -37
  88. data/client-app/app/templates/components/panel-resizer.hbs +0 -3
  89. data/client-app/app/templates/components/patterns-list.hbs +0 -78
  90. data/client-app/app/templates/components/tabbed-section.hbs +0 -18
  91. data/client-app/app/templates/components/time-formatter.hbs +0 -1
  92. data/client-app/app/templates/index.hbs +0 -165
  93. data/client-app/app/templates/settings.hbs +0 -47
  94. data/client-app/app/templates/show.hbs +0 -13
  95. data/client-app/config/ember-cli-update.json +0 -18
  96. data/client-app/config/environment.js +0 -51
  97. data/client-app/config/icons.js +0 -28
  98. data/client-app/config/optional-features.json +0 -6
  99. data/client-app/config/targets.js +0 -26
  100. data/client-app/ember-cli-build.js +0 -28
  101. data/client-app/package.json +0 -76
  102. data/client-app/preload-json-manager.rb +0 -35
  103. data/client-app/public/assets/images/icon_144x144.png +0 -0
  104. data/client-app/public/assets/images/icon_64x64.png +0 -0
  105. data/client-app/testem.js +0 -23
  106. data/client-app/tests/index.html +0 -41
  107. data/client-app/tests/integration/components/back-to-site-link-test.js +0 -20
  108. data/client-app/tests/integration/components/back-trace-test.js +0 -138
  109. data/client-app/tests/integration/components/env-tab-test.js +0 -220
  110. data/client-app/tests/integration/components/message-info-test.js +0 -122
  111. data/client-app/tests/integration/components/patterns-list-test.js +0 -76
  112. data/client-app/tests/test-helper.js +0 -12
  113. data/client-app/tests/unit/controllers/index-test.js +0 -77
  114. data/client-app/tests/unit/controllers/show-test.js +0 -12
  115. data/client-app/tests/unit/routes/index-test.js +0 -11
  116. data/client-app/tests/unit/routes/show-test.js +0 -11
  117. data/client-app/yarn.lock +0 -9905
  118. data/gemfiles/rails_6.1.gemfile +0 -12
  119. data/gemfiles/rails_7.0.gemfile +0 -12
  120. data/gemfiles/rails_7.1.gemfile +0 -9
  121. data/gemfiles/rails_7.2.gemfile +0 -9
  122. data/logster.gemspec +0 -43
  123. data/test/dummy/config/application.rb +0 -31
  124. data/test/dummy/config/boot.rb +0 -6
  125. data/test/dummy/config/environment.rb +0 -6
  126. data/test/examples/test_sidekiq_reporter_example.rb +0 -47
  127. data/test/fake_data/Gemfile +0 -6
  128. data/test/fake_data/generate.rb +0 -23
  129. data/test/logster/middleware/test_reporter.rb +0 -84
  130. data/test/logster/middleware/test_viewer.rb +0 -495
  131. data/test/logster/test_base_store.rb +0 -224
  132. data/test/logster/test_cache.rb +0 -39
  133. data/test/logster/test_defer_logger.rb +0 -36
  134. data/test/logster/test_group.rb +0 -92
  135. data/test/logster/test_ignore_pattern.rb +0 -42
  136. data/test/logster/test_logger.rb +0 -177
  137. data/test/logster/test_message.rb +0 -269
  138. data/test/logster/test_pattern.rb +0 -144
  139. data/test/logster/test_railtie.rb +0 -21
  140. data/test/logster/test_redis_rate_limiter.rb +0 -246
  141. data/test/logster/test_redis_store.rb +0 -1165
  142. data/test/test_helper.rb +0 -44
@@ -1,224 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../test_helper"
4
- require "logster/base_store"
5
- require "logster/ignore_pattern"
6
-
7
- class TestBaseStore < Minitest::Test
8
- def setup
9
- @store = Logster::TestStore.new
10
- @store.clear_all
11
- end
12
-
13
- def teardown
14
- @store.clear_all
15
- end
16
-
17
- def test_report_skip_empty
18
- @store.skip_empty = true
19
- @store.report(Logger::WARN, "test", nil)
20
- @store.report(Logger::WARN, "test", "")
21
- @store.report(Logger::WARN, "test", "foo") #
22
- @store.skip_empty = false
23
- @store.report(Logger::WARN, "test", nil) #
24
-
25
- assert_equal(2, @store.count)
26
- end
27
-
28
- def test_report_skip_level
29
- @store.level = nil
30
- @store.report(Logger::DEBUG, "test", "A") #
31
- @store.level = Logger::WARN
32
- @store.report(Logger::DEBUG, "test", "A")
33
- @store.report(Logger::INFO, "test", "B")
34
- @store.report(Logger::WARN, "test", "C") #
35
- @store.report(Logger::ERROR, "test", "D") #
36
- assert_equal(3, @store.count)
37
- end
38
-
39
- def test_report_skip_ignore
40
- @store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity")
41
- @store.report(
42
- Logger::FATAL,
43
- "test",
44
- "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9947)",
45
- )
46
- @store.report(Logger::WARN, "test", "B")
47
- @store.ignore = [
48
- /^ActiveRecord::RecordNotFound \(Couldn't find Upload/,
49
- /^Can't verify CSRF token authenticity/,
50
- ]
51
- @store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity")
52
- @store.report(
53
- Logger::FATAL,
54
- "test",
55
- "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9947)",
56
- )
57
- @store.report(
58
- Logger::FATAL,
59
- "test",
60
- "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9489+78946947)",
61
- )
62
- @store.report(Logger::WARN, "test", "B")
63
-
64
- assert_equal(4, @store.count)
65
- end
66
-
67
- def test_ignore_pattern_basic
68
- @store.ignore = [Logster::IgnorePattern.new(nil, username: "CausingErrors")]
69
- @store.report(Logger::WARN, "test", "Foobar") #
70
- @store.report(Logger::WARN, "test", "Foobar", env: { username: "CausingErrors" })
71
- @store.report(Logger::WARN, "test", "Foobar", env: nil)
72
- @store.report(Logger::WARN, "test", "Something Else", env: { username: "CausingErrors" })
73
- @store.report(Logger::WARN, "test", "Something Else", env: { "username" => "CausingErrors" })
74
- @store.report(Logger::WARN, "test", "Something Else", env: { username: "GoodPerson" }) #
75
- @store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity") #
76
-
77
- assert_equal(4, @store.count)
78
- end
79
-
80
- def test_ignore_pattern_real
81
- @store.ignore = [
82
- /^ActionController::RoutingError \(No route matches/,
83
- Logster::IgnorePattern.new(
84
- "Can't verify CSRF token authenticity",
85
- REQUEST_URI: %r{/trackback/$},
86
- ),
87
- ]
88
- # blocked
89
- @store.report(
90
- Logger::WARN,
91
- "whatever",
92
- "Can't verify CSRF token authenticity",
93
- env: {
94
- HTTP_HOST: "meta.discourse.org",
95
- REQUEST_URI: "/t/use-more-standard-smiley-codes-instead-of-smile/1822/trackback/",
96
- REQUEST_METHOD: "POST",
97
- HTTP_USER_AGENT: "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",
98
- params: {
99
- title: "Something Spammy",
100
- url: "http://spam.example.net/whatever/spam.html",
101
- excerpt: "http://spam.example.com/pdf/blahblah.html free viagra",
102
- blog_name: "get free spam for cheap",
103
- },
104
- },
105
- )
106
- # logged
107
- @store.report(
108
- Logger::WARN,
109
- "whatever",
110
- "Can't verify CSRF token authenticity",
111
- env: {
112
- HTTP_HOST: "meta.discourse.org",
113
- REQUEST_URI: "/session",
114
- REQUEST_METHOD: "POST",
115
- HTTP_USER_AGENT:
116
- "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36",
117
- params: {
118
- username: "user",
119
- password: "password",
120
- form_authenticity_token: "incorrect",
121
- },
122
- },
123
- )
124
- assert_equal(1, @store.count)
125
- end
126
-
127
- def test_timestamp
128
- time = Time.now - 24 * 60 * 60
129
- message = @store.report(Logger::WARN, "test", "B", timestamp: time)
130
-
131
- assert_equal(time, message.timestamp)
132
- end
133
-
134
- def test_backtrace
135
- # Create an error with a backtrace
136
- error = TypeError.new
137
- begin
138
- raise error
139
- rescue => e
140
- error = e
141
- end
142
-
143
- # Backtrace can be passed via backtrace param or env
144
- message = @store.report(Logger::WARN, "test", "A", backtrace: error.backtrace)
145
- assert_equal(error.backtrace.join("\n"), message.backtrace)
146
- message = @store.report(Logger::WARN, "test", "B", env: { backtrace: error.backtrace })
147
- assert_equal(error.backtrace.join("\n"), message.backtrace)
148
-
149
- # Via env takes priority
150
- message =
151
- @store.report(
152
- Logger::WARN,
153
- "test",
154
- "C",
155
- backtrace: "Garbage",
156
- env: {
157
- backtrace: error.backtrace,
158
- },
159
- )
160
- assert_equal(error.backtrace.join("\n"), message.backtrace)
161
-
162
- # Backtrace is always a string
163
- # Cannot do an equal assert here, because it uses `caller` when not provided
164
- message = @store.report(Logger::WARN, "test", "D", backtrace: nil)
165
- assert_kind_of(String, message.backtrace)
166
- message = @store.report(Logger::WARN, "test", "E", env: { backtrace: nil })
167
- assert_kind_of(String, message.backtrace)
168
- message = @store.report(Logger::WARN, "test", "F", backtrace: nil, env: { backtrace: nil })
169
- assert_kind_of(String, message.backtrace)
170
- message = @store.report(Logger::WARN, "test", "G")
171
- assert_kind_of(String, message.backtrace)
172
-
173
- # Arrays are turned into strings via join \n
174
- message = @store.report(Logger::WARN, "test", "H", backtrace: %w[Foo Bar])
175
- assert_equal("Foo\nBar", message.backtrace)
176
- end
177
-
178
- def test_chained_loggers_dont_have_superfluous_frames_in_backtrace
179
- logger = Logster::Logger.new(@store)
180
- other_store = Logster::TestStore.new
181
- other_logger = Logster::Logger.new(other_store)
182
- logger.chain(other_logger)
183
- logger.warn("this is warning")
184
- [@store, other_store].each do |store|
185
- message = store.reported.first
186
- assert_equal("this is warning", message.message)
187
- # the first line in the backtrace should be the method that
188
- # called the warn/info/error etc. method.
189
- # in this case the first line should be this test method
190
- assert_includes(message.backtrace.lines.first, __method__.to_s)
191
- end
192
- end
193
-
194
- def test_log_message_is_truncated_when_above_maximum_message_length
195
- orig = Logster.config.maximum_message_length
196
- Logster.config.maximum_message_length = 300
197
- msg = @store.report(Logger::WARN, "", "a" * 400)
198
- # 3 is the ... at the end to indicate truncated message
199
- assert_equal(300 + 3, msg.message.size)
200
-
201
- Logster.config.maximum_message_length = 100
202
- msg = @store.report(Logger::WARN, "", "a" * 200)
203
- assert_equal(100 + 3, msg.message.size)
204
- ensure
205
- Logster.config.maximum_message_length = orig
206
- end
207
-
208
- def test_chained_loggers_shouldnt_mutate_env_passed_to_them
209
- logger = Logster::Logger.new(@store)
210
- other_store = Logster::TestStore.new
211
- other_logger = Logster::Logger.new(other_store)
212
- logger.chain(other_logger)
213
- logger.add(Logger::WARN, "this is warning", "", { env: { backtrace: "11" } })
214
- [@store, other_store].each do |store|
215
- assert_equal("11", store.reported.first.backtrace)
216
- refute_includes(store.reported.first.env.keys.map(&:to_sym), :backtrace)
217
- end
218
- end
219
-
220
- def test_envs_with_invalid_encoding_dont_raise_errors
221
- msg = @store.report(Logger::WARN, "", "me have invalid encoding", env: { axe: "a\xF1xasa" })
222
- assert_equal("a�xasa", msg.env[:axe])
223
- end
224
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../test_helper"
4
- require "logster/cache"
5
-
6
- class TestCache < Minitest::Test
7
- def setup
8
- @cache = Logster::Cache.new(5)
9
- end
10
-
11
- def test_cache_works
12
- prc = Proc.new { |key, value| @cache.fetch(key) { value } }
13
- value = "I should be retured"
14
- assert_equal(value, prc.call(:key1, value))
15
- cached_value = value
16
- value = "I shouldn't be returned"
17
- assert_equal(cached_value, prc.call(:key1, value))
18
- value2 = "value for key2"
19
- assert_equal(value2, prc.call(:key2, value2))
20
-
21
- value = value2 = "Now I should be returned"
22
- Process.stub :clock_gettime, Process.clock_gettime(Process::CLOCK_MONOTONIC) + 6 do
23
- assert_equal(value, prc.call(:key1, value))
24
- assert_equal(value2, prc.call(:key2, value2))
25
- end
26
- end
27
-
28
- def test_cache_can_be_cleared
29
- value = "cached"
30
- prc = Proc.new { |key, val| @cache.fetch(key) { val } }
31
- assert_equal(value, prc.call(:key1, value))
32
- assert_equal("v2", prc.call(:key2, "v2"))
33
-
34
- value = "new value"
35
- @cache.clear(:key1)
36
- assert_equal(value, prc.call(:key1, value))
37
- assert_equal("v2", prc.call(:key2, "v2.2"))
38
- end
39
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../test_helper"
4
- require "logster/defer_logger"
5
- require "logster/logger"
6
-
7
- class TestDeferLogger < Minitest::Test
8
- def setup
9
- @store = TestStore.new
10
- @defer_logger = Logster::DeferLogger.new(@store)
11
- end
12
-
13
- def test_defer_logger_inherits_logger
14
- assert(Logster::Logger === @defer_logger)
15
- end
16
-
17
- def test_work_is_done_async
18
- queue = Logster::Scheduler.queue
19
- assert_equal(0, queue.size)
20
-
21
- @defer_logger.add(4, "hi this a test", "prog")
22
-
23
- assert_equal(1, queue.size)
24
- queue << :terminate
25
- Logster::Scheduler.thread.join
26
- assert_equal(1, @store.calls.size)
27
-
28
- # we need to make sure the backtrace is passed from the main thread.
29
- # Otherwise we'd only get a partial backtrace from
30
- # the point the new thread was spawned
31
- backtrace = @store.calls.first[3][:backtrace]
32
- assert_includes(backtrace.lines.first, __method__.to_s)
33
-
34
- assert_equal(0, queue.size)
35
- end
36
- end
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../test_helper"
4
- require "logster/group"
5
- require "logster/message"
6
-
7
- class TestGroup < MiniTest::Test
8
- def test_changed_is_true_for_new_instances
9
- assert Logster::Group.new("/somekey/").changed?
10
- end
11
-
12
- def test_from_json_works_correctly
13
- time = (Time.now.to_f * 1000).to_i - 5000
14
- json =
15
- JSON.generate(
16
- key: "/somekey/",
17
- messages_keys: [111, 222, 333].map(&:to_s),
18
- timestamp: time,
19
- count: 3,
20
- )
21
- group = Logster::Group.from_json(json)
22
- refute group.changed?
23
- assert_equal 3, group.count
24
- assert_equal time, group.timestamp
25
- end
26
-
27
- def test_doesnt_add_duplicate_messages
28
- group = get_group
29
- msg1 = get_message
30
- assert_equal 0, group.count
31
- group.add_message(msg1)
32
- assert_equal 1, group.count
33
- assert_equal msg1.timestamp, group.timestamp
34
- group.add_message(msg1)
35
- assert_equal 1, group.count
36
-
37
- msg2 = get_message
38
- msg2.timestamp -= 10_000
39
- group.add_message(msg2)
40
- assert_equal 2, group.count
41
- assert_equal msg1.timestamp, group.timestamp
42
- end
43
-
44
- def test_adding_multiple_messages_works_correctly
45
- group = get_group
46
- messages = [get_message(10), get_message(5), get_message(74), get_message(26)]
47
- messages << messages[0]
48
- group.messages = messages
49
- group.count = 4
50
- assert_equal 4, group.count
51
- assert_equal 74, group.timestamp
52
- expected = messages.uniq(&:key).sort_by(&:timestamp).map(&:key).reverse
53
- assert_equal expected, group.messages_keys
54
- end
55
-
56
- def test_doesnt_exceed_max_size
57
- Logster::Group.instance_variable_set(:@max_size, 5)
58
- group = get_group
59
- messages = [
60
- get_message(10),
61
- get_message(5),
62
- get_message(74),
63
- get_message(26),
64
- get_message(44),
65
- get_message(390),
66
- ]
67
- messages.each { |m| group.add_message(m) }
68
- # the count attr keeps track of the number of messages
69
- # that has ever been added to the group.
70
- # It should never decrease
71
- assert_equal 6, group.count
72
- assert_equal 390, group.timestamp
73
- refute_includes group.messages_keys, messages.find { |m| m.timestamp == 10 }.key
74
-
75
- group = get_group
76
- group.messages = messages
77
- assert_equal 390, group.timestamp
78
- refute_includes group.messages.map(&:timestamp), 5
79
- ensure
80
- Logster::Group.remove_instance_variable(:@max_size)
81
- end
82
-
83
- private
84
-
85
- def get_group
86
- Logster::Group.new("/groupkey/")
87
- end
88
-
89
- def get_message(timestamp = nil)
90
- Logster::Message.new(0, "", "testmessage", timestamp)
91
- end
92
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../test_helper"
4
- require "logster/ignore_pattern"
5
-
6
- class TestIgnorePattern < Minitest::Test
7
- def test_string_message_pattern
8
- msg = Logster::Message.new(Logger::WARN, "test", "my error (oh no!)")
9
- msg_frog = Logster::Message.new(Logger::WARN, "test", "a frog")
10
- msg_nil = Logster::Message.new(Logger::WARN, "test", nil)
11
-
12
- pattern = Logster::IgnorePattern.new("my error (")
13
-
14
- assert pattern.matches? msg
15
- assert !pattern.matches?(msg_frog)
16
- assert !pattern.matches?(msg_nil)
17
- end
18
-
19
- def test_env_pattern
20
- msg = Logster::Message.new(Logger::WARN, "test", "my error")
21
- msg.env = { "frogs" => "are big" }
22
-
23
- pattern = Logster::IgnorePattern.new(nil, frogs: "big")
24
-
25
- assert pattern.matches? msg
26
-
27
- msg.env = { legs: nil }
28
- assert !(pattern.matches? msg)
29
-
30
- msg.env = { legs: 3 }
31
- assert !(pattern.matches? msg)
32
-
33
- msg.env = { frogs: "small" }
34
- assert !pattern.matches?(msg)
35
-
36
- pattern = Logster::IgnorePattern.new(nil, "small")
37
- assert pattern.matches? msg
38
-
39
- msg.env = { frogs: "big" }
40
- assert !(pattern.matches? msg)
41
- end
42
- end
@@ -1,177 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../test_helper"
4
- require "logster/logger"
5
- require "logger"
6
-
7
- class TestStore < Logster::BaseStore
8
- attr_accessor :calls
9
-
10
- def report(*args)
11
- (@calls ||= []) << args
12
- end
13
- end
14
-
15
- class TestLogger < Minitest::Test
16
- def setup
17
- @store = TestStore.new
18
- @logger = Logster::Logger.new(@store)
19
- end
20
-
21
- def test_only_logs_valid_encoding
22
- @logger.add(4, "a \xE4 test", "prog")
23
- _, _, message = @store.calls[0]
24
- assert_equal true, message.valid_encoding?
25
- end
26
-
27
- def test_per_thread_override
28
- logger2 = Logster::Logger.new(@store)
29
- logger2.override_level = 2
30
-
31
- # we should not leak between objects
32
- assert_nil @logger.override_level
33
-
34
- @logger.override_level = 2
35
-
36
- @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
37
- Thread.new { @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" }) }.join
38
-
39
- @logger.override_level = nil
40
- @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
41
-
42
- assert_equal 2, @store.calls.length
43
- end
44
-
45
- def test_backtrace
46
- @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
47
- assert_equal "backtrace", @store.calls[0][3][:backtrace]
48
- end
49
-
50
- def test_chain
51
- io = StringIO.new
52
- @logger.chain Logger.new(io)
53
- @logger.warn "boom"
54
-
55
- assert_match(/W,.*boom/, io.string)
56
- end
57
-
58
- def test_backtrace_with_chain
59
- @other_store = TestStore.new
60
- @logger.chain(Logster::Logger.new(@other_store))
61
-
62
- @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
63
-
64
- [@store, @other_store].each { |store| assert_equal "backtrace", store.calls[0][3][:backtrace] }
65
- end
66
-
67
- def test_add_with_one_argument
68
- @logger.add(2) { "test" }
69
- @logger.add(2)
70
- assert_equal 2, @store.calls.length
71
- assert_equal "test", @store.calls.first[2]
72
- end
73
-
74
- def test_subscribing_to_logger_events
75
- custom_logger_klass =
76
- Class.new do
77
- attr_reader :events
78
-
79
- def initialize
80
- @events = []
81
- end
82
-
83
- def log(severity, message, progname, opts, &block)
84
- @events.push({ severity:, message:, progname:, opts:, block: })
85
- end
86
- end
87
-
88
- custom_logger = custom_logger_klass.new
89
-
90
- @logger.subscribe do |severity, message, progname, opts, &block|
91
- custom_logger.log(severity, message, progname, opts, &block)
92
- end
93
-
94
- @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
95
- @logger.add(1, nil, nil, backtrace: "backtrace") { "yielded message" }
96
-
97
- first_event = custom_logger.events[0]
98
-
99
- assert_equal(0, first_event[:severity])
100
- assert_equal("test", first_event[:message])
101
- assert_equal("prog", first_event[:progname])
102
- assert_equal({ backtrace: "backtrace", env: { a: "x" } }, first_event[:opts])
103
- assert_nil first_event[:block]
104
-
105
- second_event = custom_logger.events[1]
106
-
107
- assert_equal(1, second_event[:severity])
108
- assert_nil second_event[:message]
109
- assert_nil second_event[:progname]
110
- assert_equal({ backtrace: "backtrace", env: nil }, second_event[:opts])
111
- assert_equal("yielded message", second_event[:block].call)
112
- end
113
-
114
- class NewLogger < Logster::Logger
115
- end
116
-
117
- def test_inherited_logger_backtrace_with_chain
118
- @other_store = TestStore.new
119
- @logger = NewLogger.new(@store)
120
- @logger.chain(Logster::Logger.new(@other_store))
121
-
122
- @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
123
-
124
- [@store, @other_store].each { |store| assert_equal "backtrace", store.calls[0][3][:backtrace] }
125
- end
126
-
127
- def test_progname_parameter
128
- @logger.add(0, "test")
129
- progname = @store.calls[0][1]
130
- assert_nil progname
131
- end
132
-
133
- class PlayLogger
134
- attr_accessor :skip_store
135
- def initialize(tester)
136
- @tester = tester
137
- end
138
-
139
- def add(s, m, p, &block)
140
- @tester.assert(skip_store)
141
- end
142
- end
143
-
144
- def test_chain_with_ignore
145
- @logger.chain PlayLogger.new(self)
146
- @logger.skip_store = true
147
- @logger.warn("testing")
148
- end
149
-
150
- def test_logging_an_error_gets_backtrace_from_the_error
151
- exception = error_instance(Exception)
152
- std_err = error_instance(StandardError)
153
- custom_err = error_instance(Class.new(StandardError))
154
-
155
- @logger.error(exception)
156
- @logger.fatal(std_err)
157
- @logger.fatal(custom_err)
158
-
159
- assert_equal exception.backtrace.join("\n"), @store.calls[0][3][:backtrace]
160
- assert_equal std_err.backtrace.join("\n"), @store.calls[1][3][:backtrace]
161
- assert_equal custom_err.backtrace.join("\n"), @store.calls[2][3][:backtrace]
162
- end
163
-
164
- def test_formatter
165
- @logger.formatter = ->(severity, datetime, progname, msg) { "[test] #{msg}" }
166
- @logger.add(0, "hello")
167
- assert_equal "[test] hello", @store.calls[0][2]
168
- end
169
-
170
- private
171
-
172
- def error_instance(error_class)
173
- raise error_class.new
174
- rescue error_class => e
175
- e
176
- end
177
- end