logster 2.10.1 → 2.11.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -43,6 +43,7 @@
43
43
  "ember-maybe-import-regenerator": "^0.1.6",
44
44
  "ember-qunit": "^4.6.0",
45
45
  "ember-resolver": "^7.0.0",
46
+ "ember-sinon-qunit": "^6.0.0",
46
47
  "ember-source": "^3.15.0",
47
48
  "eslint-plugin-ember": "^7.13.0",
48
49
  "eslint-plugin-node": "^10.0.0",
@@ -57,6 +58,6 @@
57
58
  "edition": "octane"
58
59
  },
59
60
  "dependencies": {
60
- "moment": "~2.22.2"
61
+ "moment": "~2.29.2"
61
62
  }
62
63
  }
@@ -1,12 +1,30 @@
1
1
  import { module, test } from 'qunit';
2
2
  import { setupTest } from 'ember-qunit';
3
+ import { default as MessageCollection } from "client-app/models/message-collection";
4
+ import sinon from "sinon";
5
+ import * as utilities from "client-app/lib/utilities";
3
6
 
4
- module('Unit | Controller | index', function(hooks) {
7
+ module('Unit | Controller | index', function (hooks) {
5
8
  setupTest(hooks);
6
9
 
7
- // Replace this with your real tests.
8
- test('it exists', function(assert) {
9
- let controller = this.owner.lookup('controller:index');
10
- assert.ok(controller);
10
+ test('uses search param to filter results', function (assert) {
11
+ const controller = this.owner.lookup('controller:index');
12
+ const ajaxStub = sinon.stub(utilities, 'ajax')
13
+ const messages = MessageCollection.create();
14
+ const row1 = {"message": "error tomtom", "severity": 2, "key": "ce1f53b0cc"};
15
+ const row2 = {"message": "error steaky", "severity": 3, "key": "b083352825"};
16
+
17
+ messages.rows.addObjects([row1, row2]);
18
+ controller.set("model", messages)
19
+
20
+ assert.equal(controller.searchTerm, null, 'initial value is null');
21
+ assert.deepEqual(controller.model.rows, [row1, row2], 'all rows');
22
+
23
+ ajaxStub.callsFake(() => Promise.resolve({search: "tomtom", filter: [5], messages: []}));
24
+ controller.set("search", "tomtom");
25
+
26
+ assert.equal(controller.searchTerm, "tomtom", 'search sets search term');
27
+ assert.equal(ajaxStub.firstCall.args[0], "/messages.json", "get messages");
28
+ assert.deepEqual(ajaxStub.firstCall.args[1], {"data": {"filter": "5", "search": "tomtom"}}, "with correct terms");
11
29
  });
12
30
  });
@@ -4,7 +4,7 @@ require 'logger'
4
4
 
5
5
  module Logster
6
6
  class Logger < ::Logger
7
- LOGSTER_ENV = "logster_env".freeze
7
+ LOGSTER_ENV = "logster_env"
8
8
 
9
9
  attr_accessor :store, :skip_store
10
10
  attr_reader :chained
@@ -12,21 +12,17 @@ module Logster
12
12
  def initialize(store)
13
13
  super(nil)
14
14
  @store = store
15
- @override_levels = nil
16
15
  @chained = []
17
16
  @skip_store = false
17
+ @logster_override_level_key = "logster_override_level_#{object_id}"
18
18
  end
19
19
 
20
20
  def override_level=(val)
21
- tid = Thread.current.object_id
22
-
23
- ol = @override_levels
24
- if val.nil? && ol && ol.key?(tid)
25
- ol.delete(tid)
26
- @override_levels = nil if ol.length == 0
27
- elsif val
28
- (@override_levels ||= {})[tid] = val
29
- end
21
+ Thread.current[@logster_override_level_key] = val
22
+ end
23
+
24
+ def override_level
25
+ Thread.current[@logster_override_level_key]
30
26
  end
31
27
 
32
28
  def chain(logger)
@@ -55,8 +51,7 @@ module Logster
55
51
  end
56
52
 
57
53
  def level
58
- ol = @override_levels
59
- (ol && ol[Thread.current.object_id]) || @level
54
+ Thread.current[@logster_override_level_key] || @level
60
55
  end
61
56
 
62
57
  def add_with_opts(severity, message = nil, progname = progname(), opts = nil, &block)
@@ -74,9 +69,13 @@ module Logster
74
69
  # own methods don't show up as the first few frames in the backtrace
75
70
  if !opts || !opts.key?(:backtrace)
76
71
  opts ||= {}
77
- backtrace = caller_locations
78
- while backtrace.first.path.end_with?("/logger.rb")
79
- backtrace.shift
72
+ backtrace = message.backtrace if message.kind_of?(::Exception)
73
+ backtrace ||= progname.backtrace if progname.kind_of?(::Exception)
74
+ if !backtrace
75
+ backtrace = caller_locations
76
+ while backtrace.first.path.end_with?("/logger.rb")
77
+ backtrace.shift
78
+ end
80
79
  end
81
80
  backtrace = backtrace.join("\n")
82
81
  opts[:backtrace] = backtrace
@@ -27,10 +27,10 @@ module Logster
27
27
  end
28
28
  end
29
29
 
30
- @redis.multi do
31
- @redis.hset(grouping_key, message.grouping_key, message.key)
32
- @redis.rpush(list_key, message.key)
33
- update_message(message, save_env: true)
30
+ @redis.multi do |pipeline|
31
+ pipeline.hset(grouping_key, message.grouping_key, message.key)
32
+ pipeline.rpush(list_key, message.key)
33
+ update_message(message, save_env: true, redis: pipeline)
34
34
  end
35
35
 
36
36
  trim
@@ -41,30 +41,30 @@ module Logster
41
41
 
42
42
  def delete(msg)
43
43
  groups = find_pattern_groups() { |pat| msg.message =~ pat }
44
- @redis.multi do
44
+ @redis.multi do |pipeline|
45
45
  groups.each do |group|
46
46
  group.remove_message(msg)
47
- save_pattern_group(group) if group.changed?
47
+ save_pattern_group(group, redis: pipeline) if group.changed?
48
48
  end
49
- @redis.hdel(hash_key, msg.key)
50
- delete_env(msg.key)
51
- @redis.hdel(grouping_key, msg.grouping_key)
52
- @redis.lrem(list_key, -1, msg.key)
49
+ pipeline.hdel(hash_key, msg.key)
50
+ delete_env(msg.key, redis: pipeline)
51
+ pipeline.hdel(grouping_key, msg.grouping_key)
52
+ pipeline.lrem(list_key, -1, msg.key)
53
53
  end
54
54
  end
55
55
 
56
56
  def bulk_delete(message_keys, grouping_keys)
57
57
  groups = find_pattern_groups(load_messages: true)
58
- @redis.multi do
58
+ @redis.multi do |pipeline|
59
59
  groups.each do |group|
60
60
  group.messages = group.messages.reject { |m| message_keys.include?(m.key) }
61
- save_pattern_group(group) if group.changed?
61
+ save_pattern_group(group, redis: pipeline) if group.changed?
62
62
  end
63
- @redis.hdel(hash_key, message_keys)
64
- @redis.hdel(grouping_key, grouping_keys)
63
+ pipeline.hdel(hash_key, message_keys)
64
+ pipeline.hdel(grouping_key, grouping_keys)
65
65
  message_keys.each do |k|
66
- @redis.lrem(list_key, -1, k)
67
- delete_env(k)
66
+ pipeline.lrem(list_key, -1, k)
67
+ delete_env(k, redis: pipeline)
68
68
  end
69
69
  end
70
70
  end
@@ -74,11 +74,11 @@ module Logster
74
74
  exists = @redis.hexists(hash_key, message.key)
75
75
  return false unless exists
76
76
 
77
- @redis.multi do
78
- @redis.hset(hash_key, message.key, message.to_json(exclude_env: true))
79
- push_env(message.key, message.env_buffer) if message.has_env_buffer?
80
- @redis.lrem(list_key, -1, message.key)
81
- @redis.rpush(list_key, message.key)
77
+ @redis.multi do |pipeline|
78
+ pipeline.hset(hash_key, message.key, message.to_json(exclude_env: true))
79
+ push_env(message.key, message.env_buffer, redis: pipeline) if message.has_env_buffer?
80
+ pipeline.lrem(list_key, -1, message.key)
81
+ pipeline.rpush(list_key, message.key)
82
82
  end
83
83
  message.env_buffer = [] if message.has_env_buffer?
84
84
  check_rate_limits(message.severity)
@@ -188,11 +188,12 @@ module Logster
188
188
  .sort
189
189
  .map(&:key)
190
190
 
191
- @redis.pipelined do
191
+ @redis.pipelined do |pipeline|
192
192
  sorted.each do |message_key|
193
- @redis.rpush(list_key, message_key)
193
+ pipeline.rpush(list_key, message_key)
194
194
  end
195
195
  end
196
+
196
197
  find_pattern_groups(load_messages: true).each do |group|
197
198
  group.messages = group.messages.select { |m| sorted.include?(m.key) }
198
199
  save_pattern_group(group) if group.changed?
@@ -383,11 +384,11 @@ module Logster
383
384
  jsons
384
385
  end
385
386
 
386
- def save_pattern_group(group)
387
+ def save_pattern_group(group, redis: @redis)
387
388
  if group.messages_keys.size == 0
388
- @redis.hdel(pattern_groups_key, group.key)
389
+ redis.hdel(pattern_groups_key, group.key)
389
390
  else
390
- @redis.hset(pattern_groups_key, group.key, group.to_json)
391
+ redis.hset(pattern_groups_key, group.key, group.to_json)
391
392
  end
392
393
  end
393
394
 
@@ -429,13 +430,13 @@ module Logster
429
430
  end
430
431
  end
431
432
 
432
- def update_message(message, save_env: false)
433
- @redis.hset(hash_key, message.key, message.to_json(exclude_env: true))
434
- push_env(message.key, message.env) if save_env
433
+ def update_message(message, save_env: false, redis: @redis)
434
+ redis.hset(hash_key, message.key, message.to_json(exclude_env: true))
435
+ push_env(message.key, message.env, redis: redis) if save_env
435
436
  if message.protected
436
- @redis.sadd(protected_key, message.key)
437
+ redis.sadd(protected_key, message.key)
437
438
  else
438
- @redis.srem(protected_key, message.key)
439
+ redis.srem(protected_key, message.key)
439
440
  end
440
441
  end
441
442
 
@@ -640,15 +641,15 @@ module Logster
640
641
  rate_limiter
641
642
  end
642
643
 
643
- def push_env(message_key, env)
644
+ def push_env(message_key, env, redis: @redis)
644
645
  prefixed = env_prefix(message_key)
645
646
  env = [env] unless Array === env
646
- @redis.lpush(prefixed, env.map(&:to_json).reverse)
647
- @redis.ltrim(prefixed, 0, Logster.config.max_env_count_per_message - 1)
647
+ redis.lpush(prefixed, env.map(&:to_json).reverse)
648
+ redis.ltrim(prefixed, 0, Logster.config.max_env_count_per_message - 1)
648
649
  end
649
650
 
650
- def delete_env(message_key)
651
- @redis.del(env_prefix(message_key))
651
+ def delete_env(message_key, redis: @redis)
652
+ redis.del(env_prefix(message_key))
652
653
  end
653
654
 
654
655
  def env_unprefix(key, with_namespace: false)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Logster
4
- VERSION = "2.10.1"
4
+ VERSION = "2.11.2"
5
5
  end
@@ -26,6 +26,12 @@ class TestLogger < Minitest::Test
26
26
  end
27
27
 
28
28
  def test_per_thread_override
29
+ logger2 = Logster::Logger.new(@store)
30
+ logger2.override_level = 2
31
+
32
+ # we should not leak between objects
33
+ assert_nil @logger.override_level
34
+
29
35
  @logger.override_level = 2
30
36
 
31
37
  @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
@@ -106,4 +112,26 @@ class TestLogger < Minitest::Test
106
112
  @logger.skip_store = true
107
113
  @logger.warn("testing")
108
114
  end
115
+
116
+ def test_logging_an_error_gets_backtrace_from_the_error
117
+ exception = error_instance(Exception)
118
+ std_err = error_instance(StandardError)
119
+ custom_err = error_instance(Class.new(StandardError))
120
+
121
+ @logger.error(exception)
122
+ @logger.fatal(std_err)
123
+ @logger.fatal(custom_err)
124
+
125
+ assert_equal exception.backtrace.join("\n"), @store.calls[0][3][:backtrace]
126
+ assert_equal std_err.backtrace.join("\n"), @store.calls[1][3][:backtrace]
127
+ assert_equal custom_err.backtrace.join("\n"), @store.calls[2][3][:backtrace]
128
+ end
129
+
130
+ private
131
+
132
+ def error_instance(error_class)
133
+ raise error_class.new
134
+ rescue error_class => e
135
+ e
136
+ end
109
137
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logster
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.10.1
4
+ version: 2.11.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-01 00:00:00.000000000 Z
11
+ date: 2022-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler