escalating_logger 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: '06191e9214236185a8cb64d31ee7f8a3f6148eb049b768716ea0f51ea7cf71dc'
4
+ data.tar.gz: 75221d84d36a1aab928014c7b37115e69671ccac4e342f46834444b9e347665c
5
+ SHA512:
6
+ metadata.gz: 61fca0b72f08cc0c90bcf223ec6711eb6623da0546129fdd2f2db34fb973867577f816eb5c0c496bc56ca867fa02373f5cdb87976c8a790520f25ef34b12044e
7
+ data.tar.gz: 9e884465748f9727a76699cccf7ce844ccd961cdaf437425589b4683a56a8e5bfd7880f21cd4c9541d378461ddb8dfb1ae4b44dc2e19c2675263e3bd5885700f
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EscalatingLogger
4
+ VERSION = '0.0.1'
5
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './escalating_logger/version'
4
+ require 'logger'
5
+ require 'bozos_buckets'
6
+
7
+ module EscalatingLogger
8
+ # EscalatingLogger::Logger subclasses the standard Logger class. This
9
+ # subclass maintains the same API as Logger itself, so it can be used
10
+ # anywhere you use Logger today
11
+ class Logger < Logger
12
+ DECREASE_VERBOSITY = 1
13
+ INCREASE_VERBOSITY = -1
14
+
15
+ attr_accessor :min_verbosity, :max_verbosity, :initial_token_count, :refill_rate,
16
+ :max_token_count, :triggering_log_levels, :bucket
17
+
18
+ # rubocop:disable Metrics/ParameterLists
19
+ # rubocop:disable Metrics/MethodLength
20
+ def initialize(
21
+ logdev,
22
+ shift_age = 0,
23
+ shift_size = 1_048_576,
24
+ level: DEBUG,
25
+ progname: nil,
26
+ formatter: nil,
27
+ datetime_format: nil,
28
+ binmode: false,
29
+ shift_period_suffix: '%Y%m%d',
30
+ min_verbosity: Logger::ERROR,
31
+ max_verbosity: Logger::DEBUG,
32
+ initial_token_count: 100,
33
+ refill_rate: 1,
34
+ max_token_count: 100,
35
+ triggering_log_levels: [Logger::ERROR]
36
+ )
37
+
38
+ @triggering_log_levels = triggering_log_levels
39
+ @max_verbosity = max_verbosity
40
+ @min_verbosity = min_verbosity
41
+ @initial_token_count = initial_token_count
42
+ @refill_rate = refill_rate
43
+ @max_token_count = max_token_count
44
+
45
+ @bucket = BozosBuckets::Bucket.new(initial_token_count: initial_token_count,
46
+ refill_rate: refill_rate, max_token_count: max_token_count)
47
+
48
+ super(
49
+ logdev,
50
+ shift_age,
51
+ shift_size,
52
+ level: level,
53
+ progname: progname,
54
+ formatter: formatter,
55
+ datetime_format: datetime_format,
56
+ binmode: binmode,
57
+ shift_period_suffix: shift_period_suffix
58
+ )
59
+ end
60
+ # rubocop:enable Metrics/ParameterLists
61
+ # rubocop:enable Metrics/MethodLength
62
+
63
+ # Overrides `add` method to catch all forms of invocations. See
64
+ # https://github.com/ruby/ruby/blob/b56c8f814e656e6a680acf2e5c96812e84af238d/lib/logger.rb#L459
65
+ def add(severity, message = nil, progname = nil)
66
+ # If severity is error/warning/whatever, check if the rate limit has
67
+ # been exceeded. If so, increase verbosity. If severity check is not
68
+ # triggered, decrease verbosity if the token bucket is full
69
+
70
+ # Check if verbosity should be increased if logger was invoked with
71
+ # the a triggering severity
72
+ if @triggering_log_levels.include?(severity)
73
+ # Increase verbosity if rate limit exceeded/bucket is empty
74
+ increase_verbosity unless @bucket.use_tokens
75
+ # Only attempt to decrease verbosity when the lowest severity is called
76
+ elsif severity == level
77
+ # Decrease verbosity if the bucket is full
78
+ decrease_verbosity if @bucket.current_token_count == @bucket.max_token_count
79
+ end
80
+
81
+ # Call the superclass method with the same signature
82
+ super
83
+ end
84
+
85
+ private
86
+
87
+ def increase_verbosity
88
+ change_verbosity(INCREASE_VERBOSITY)
89
+ end
90
+
91
+ def decrease_verbosity
92
+ change_verbosity(DECREASE_VERBOSITY)
93
+ end
94
+
95
+ # Negative values increase verbosity, positive values decrease verbosity
96
+ def change_verbosity(value)
97
+ current_level = level
98
+ reset_bucket
99
+ case value
100
+ when DECREASE_VERBOSITY
101
+ next_level = [current_level + 1, @min_verbosity].min
102
+ when INCREASE_VERBOSITY
103
+ next_level = [current_level - 1, @max_verbosity].max
104
+ end
105
+ self.level = next_level
106
+ end
107
+
108
+ # After changing verbosity, the bucket should be reset. Otherwise
109
+ # verbosity will change levels very quickly, instead of gradually as
110
+ # the rate limit is continually exceeded. Note that the bucket is reset
111
+ # using the attributes on the EscalatingLogger::Logger instance (e.g.
112
+ # initial_token_count)
113
+ def reset_bucket
114
+ @bucket = BozosBuckets::Bucket.new(initial_token_count: @initial_token_count,
115
+ refill_rate: @refill_rate, max_token_count: @max_token_count)
116
+ end
117
+ end
118
+ end
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: escalating_logger
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Alex Glover
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-09-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bozos_buckets
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.w
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.w
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '12.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '12.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: yard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: |2
84
+ A transparent subclass of Ruby's Logger that automatically increases log verbosity
85
+ as the number of ERRORs logged exceeds a given rate threshold. The intent is to get
86
+ more log detail when things are going wrong, and less log noise when everything is
87
+ going right.
88
+ email:
89
+ - alexdglover@gmail.com
90
+ executables: []
91
+ extensions: []
92
+ extra_rdoc_files: []
93
+ files:
94
+ - lib/escalating_logger.rb
95
+ - lib/escalating_logger/version.rb
96
+ homepage: https://github.com/alexdglover/escalating_logger
97
+ licenses:
98
+ - MIT
99
+ metadata:
100
+ homepage_uri: https://github.com/alexdglover/escalating_logger
101
+ source_code_uri: https://github.com/alexdglover/escalating_logger
102
+ changelog_uri: https://github.com/alexdglover/escalating_logger/tree/main/CHANGELOG.md
103
+ post_install_message:
104
+ rdoc_options: []
105
+ require_paths:
106
+ - lib
107
+ required_ruby_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: 2.5.0
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ requirements: []
118
+ rubygems_version: 3.2.15
119
+ signing_key:
120
+ specification_version: 4
121
+ summary: Ruby Logger subclass that automatically increases/decreases verbosity
122
+ test_files: []