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 +7 -0
- data/lib/escalating_logger/version.rb +5 -0
- data/lib/escalating_logger.rb +118 -0
- metadata +122 -0
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,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: []
|