escalating_logger 0.0.1

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.
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: []