mr_loga_loga 0.1.5 → 0.2.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.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +2 -2
- data/.github/workflows/release.yml +3 -3
- data/.tool-versions +1 -1
- data/CHANGELOG.md +11 -0
- data/Gemfile +2 -2
- data/Gemfile.lock +23 -23
- data/README.md +36 -7
- data/lib/mr_loga_loga/context.rb +7 -4
- data/lib/mr_loga_loga/formatters/json.rb +1 -2
- data/lib/mr_loga_loga/formatters/key_value.rb +2 -2
- data/lib/mr_loga_loga/instance_methods.rb +1 -1
- data/lib/mr_loga_loga/log_message.rb +15 -0
- data/lib/mr_loga_loga/logger.rb +25 -20
- data/lib/mr_loga_loga/logger_data.rb +36 -0
- data/lib/mr_loga_loga/version.rb +1 -1
- data/lib/mr_loga_loga.rb +2 -4
- metadata +5 -6
- data/lib/mr_loga_loga/extensions/lograge.rb +0 -54
- data/lib/mr_loga_loga/extensions/rails.rb +0 -154
- data/lib/mr_loga_loga/logger_proxy.rb +0 -40
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a3823df8fc816d6e6cc3bf7ce5a2457b06276a2e59fbb7985775bdd55c78b255
|
|
4
|
+
data.tar.gz: f6d410e9babfdf7d22197016c5d8f4e14f4ee2b4ba99df2e62e46a35e70f2f6d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: aa03cbe1efaf3bd72b2bedb93b8f759ac826e7350a3f62bbe238d5167cb16e50db855acd19341c6a77f32487ae953c5c9ade031997cadd1539f38d222b5f5c18
|
|
7
|
+
data.tar.gz: 3d3d98af06b08d3f0850e06ff1bb50f3573e30218746025989e4c71d3dfcf46f164f86724ad50edc9ce546ebe7a765059bc17ae2ac1cc0cb4d384a59c0f6314d
|
data/.github/workflows/main.yml
CHANGED
|
@@ -16,7 +16,7 @@ jobs:
|
|
|
16
16
|
fail-fast: false
|
|
17
17
|
|
|
18
18
|
steps:
|
|
19
|
-
- uses: actions/checkout@
|
|
19
|
+
- uses: actions/checkout@v3
|
|
20
20
|
|
|
21
21
|
- name: Set up Ruby ${{ matrix.ruby-version }}
|
|
22
22
|
uses: ruby/setup-ruby@v1
|
|
@@ -41,7 +41,7 @@ jobs:
|
|
|
41
41
|
lint:
|
|
42
42
|
runs-on: ubuntu-latest
|
|
43
43
|
steps:
|
|
44
|
-
- uses: actions/checkout@
|
|
44
|
+
- uses: actions/checkout@v3
|
|
45
45
|
with:
|
|
46
46
|
fetch-depth: 0
|
|
47
47
|
|
|
@@ -17,7 +17,7 @@ jobs:
|
|
|
17
17
|
version: ${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}.${{ steps.release.outputs.patch }}
|
|
18
18
|
|
|
19
19
|
steps:
|
|
20
|
-
- uses: actions/checkout@
|
|
20
|
+
- uses: actions/checkout@v3
|
|
21
21
|
- name: Generate Release 🗒️
|
|
22
22
|
uses: GoogleCloudPlatform/release-please-action@v3
|
|
23
23
|
id: release
|
|
@@ -33,7 +33,7 @@ jobs:
|
|
|
33
33
|
if: needs.prepare-release.outputs.release_created || github.event_name == 'workflow_dispatch'
|
|
34
34
|
|
|
35
35
|
steps:
|
|
36
|
-
- uses: actions/checkout@
|
|
36
|
+
- uses: actions/checkout@v3
|
|
37
37
|
|
|
38
38
|
- name: Set up Ruby
|
|
39
39
|
uses: ruby/setup-ruby@v1
|
|
@@ -73,7 +73,7 @@ jobs:
|
|
|
73
73
|
RUBYGEMS_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
|
|
74
74
|
|
|
75
75
|
- name: Commit Updated Files 📤
|
|
76
|
-
uses: EndBug/add-and-commit@
|
|
76
|
+
uses: EndBug/add-and-commit@v9
|
|
77
77
|
with:
|
|
78
78
|
add: "['Gemfile.lock', 'lib/mr_loga_loga/version.rb']"
|
|
79
79
|
message: "chore: post-release ${{ steps.release-version.outputs.version }}"
|
data/.tool-versions
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
ruby 3.
|
|
1
|
+
ruby 3.1.1
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
2
|
|
|
3
|
+
## [0.2.0](https://github.com/hschne/mr-loga-loga/compare/v0.1.5...v0.2.0) (2022-05-06)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### ⚠ BREAKING CHANGES
|
|
7
|
+
|
|
8
|
+
* improve compatibility by changing signature (#20)
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* improve compatibility by changing signature ([#20](https://github.com/hschne/mr-loga-loga/issues/20)) ([01e6f0f](https://github.com/hschne/mr-loga-loga/commit/01e6f0fd0482c141117a71b78ba008e97c63d808))
|
|
13
|
+
|
|
3
14
|
### [0.1.5](https://github.com/hschne/mr-loga-loga/compare/v0.1.4...v0.1.5) (2022-01-25)
|
|
4
15
|
|
|
5
16
|
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,45 +1,45 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
mr_loga_loga (0.
|
|
4
|
+
mr_loga_loga (0.2.0)
|
|
5
5
|
|
|
6
6
|
GEM
|
|
7
7
|
remote: https://rubygems.org/
|
|
8
8
|
specs:
|
|
9
9
|
ast (2.4.2)
|
|
10
|
-
diff-lcs (1.
|
|
10
|
+
diff-lcs (1.5.0)
|
|
11
11
|
docile (1.4.0)
|
|
12
|
-
parallel (1.
|
|
13
|
-
parser (3.1.
|
|
12
|
+
parallel (1.22.1)
|
|
13
|
+
parser (3.1.2.0)
|
|
14
14
|
ast (~> 2.4.1)
|
|
15
15
|
rainbow (3.1.1)
|
|
16
16
|
rake (13.0.6)
|
|
17
|
-
regexp_parser (2.
|
|
17
|
+
regexp_parser (2.3.1)
|
|
18
18
|
rexml (3.2.5)
|
|
19
|
-
rspec (3.
|
|
20
|
-
rspec-core (~> 3.
|
|
21
|
-
rspec-expectations (~> 3.
|
|
22
|
-
rspec-mocks (~> 3.
|
|
23
|
-
rspec-core (3.
|
|
24
|
-
rspec-support (~> 3.
|
|
25
|
-
rspec-expectations (3.
|
|
19
|
+
rspec (3.11.0)
|
|
20
|
+
rspec-core (~> 3.11.0)
|
|
21
|
+
rspec-expectations (~> 3.11.0)
|
|
22
|
+
rspec-mocks (~> 3.11.0)
|
|
23
|
+
rspec-core (3.11.0)
|
|
24
|
+
rspec-support (~> 3.11.0)
|
|
25
|
+
rspec-expectations (3.11.0)
|
|
26
26
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
27
|
-
rspec-support (~> 3.
|
|
28
|
-
rspec-mocks (3.
|
|
27
|
+
rspec-support (~> 3.11.0)
|
|
28
|
+
rspec-mocks (3.11.0)
|
|
29
29
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
30
|
-
rspec-support (~> 3.
|
|
31
|
-
rspec-support (3.
|
|
32
|
-
rubocop (1.
|
|
30
|
+
rspec-support (~> 3.11.0)
|
|
31
|
+
rspec-support (3.11.0)
|
|
32
|
+
rubocop (1.28.2)
|
|
33
33
|
parallel (~> 1.10)
|
|
34
34
|
parser (>= 3.1.0.0)
|
|
35
35
|
rainbow (>= 2.2.2, < 4.0)
|
|
36
36
|
regexp_parser (>= 1.8, < 3.0)
|
|
37
37
|
rexml
|
|
38
|
-
rubocop-ast (>= 1.
|
|
38
|
+
rubocop-ast (>= 1.17.0, < 2.0)
|
|
39
39
|
ruby-progressbar (~> 1.7)
|
|
40
40
|
unicode-display_width (>= 1.4.0, < 3.0)
|
|
41
|
-
rubocop-ast (1.
|
|
42
|
-
parser (>= 3.
|
|
41
|
+
rubocop-ast (1.17.0)
|
|
42
|
+
parser (>= 3.1.1.0)
|
|
43
43
|
ruby-progressbar (1.11.0)
|
|
44
44
|
simplecov (0.21.2)
|
|
45
45
|
docile (~> 1.1)
|
|
@@ -59,11 +59,11 @@ PLATFORMS
|
|
|
59
59
|
DEPENDENCIES
|
|
60
60
|
mr_loga_loga!
|
|
61
61
|
rake (~> 13.0)
|
|
62
|
-
rspec (~> 3.
|
|
63
|
-
rubocop (~> 1.
|
|
62
|
+
rspec (~> 3.11)
|
|
63
|
+
rubocop (~> 1.28)
|
|
64
64
|
simplecov (~> 0.21)
|
|
65
65
|
timecop (~> 0.9)
|
|
66
66
|
yard (~> 0.9)
|
|
67
67
|
|
|
68
68
|
BUNDLED WITH
|
|
69
|
-
2.
|
|
69
|
+
2.3.13
|
data/README.md
CHANGED
|
@@ -138,28 +138,57 @@ end
|
|
|
138
138
|
MrLogaLoga::Logger.new(STDOUT, formatter: MyFormatter.new)
|
|
139
139
|
```
|
|
140
140
|
|
|
141
|
+
## Usage with Other Gems
|
|
142
|
+
|
|
143
|
+
This section describes how you can use MrLogaLoga together with other well-known gems.
|
|
144
|
+
|
|
141
145
|
### Rails
|
|
142
146
|
|
|
143
147
|
Using MrLogaLoga in Ruby on Rails is straightforward. Set up MrLogaLoga as logger in your `application.rb` or environment files and you are off to the races:
|
|
144
148
|
|
|
145
149
|
```ruby
|
|
146
150
|
# application.rb
|
|
147
|
-
config.
|
|
148
|
-
config.
|
|
151
|
+
config.log_formatter = MrLogaLoga::Formatters::KeyValue.new
|
|
152
|
+
config.logger = MrLogaLoga::Logger.new($stdout, formatter: config.log_formatter)
|
|
149
153
|
```
|
|
150
154
|
|
|
151
155
|
Note that setting `config.log_formatter` does not work. You must set the formatter in the logger constructor as described in [Formatters](#formatters).
|
|
152
156
|
|
|
153
157
|
### Lograge
|
|
154
158
|
|
|
155
|
-
[LogRage](https://github.com/roidrage/lograge) and MrLogaLoga work well together.
|
|
159
|
+
[LogRage](https://github.com/roidrage/lograge) and MrLogaLoga work well together. You must set lograge to use the raw formatter, however:
|
|
156
160
|
|
|
157
161
|
```ruby
|
|
158
|
-
|
|
159
|
-
|
|
162
|
+
Rails.application.configure do
|
|
163
|
+
config.lograge.enabled = true
|
|
164
|
+
config.lograge.formatter = Lograge::Formatters::Raw.new
|
|
165
|
+
end
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
### Sidekiq
|
|
171
|
+
|
|
172
|
+
You can use MrLogaLoga with [Sidekiq](https://github.com/mperham/sidekiq) by configuring it like so:
|
|
173
|
+
|
|
174
|
+
```ruby
|
|
175
|
+
Sidekiq.configure_server do |config|
|
|
176
|
+
config.logger = MrLogaLoga::Logger.new($stdout, formatter: MrLogaLoga::Formatters::Json.new)
|
|
177
|
+
config.logger.level = Logger::INFO
|
|
178
|
+
|
|
179
|
+
# Remove existing error handlers to avoid double logging
|
|
180
|
+
config.error_handlers.clear
|
|
181
|
+
config.error_handlers << proc { |ex, context| Sidekiq.logger.warn(ex, context[:job]) }
|
|
182
|
+
end
|
|
160
183
|
```
|
|
161
184
|
|
|
162
|
-
|
|
185
|
+
If you want to use MrLogaLoga's helper methods in your workers you must include `MrLogaLoga` after including `Sidekiq`:
|
|
186
|
+
```ruby
|
|
187
|
+
class MyWorker
|
|
188
|
+
include Sidekiq::Worker
|
|
189
|
+
include MrLogaLoga
|
|
190
|
+
end
|
|
191
|
+
```
|
|
163
192
|
|
|
164
193
|
## Why MrLogaLoga?
|
|
165
194
|
|
|
@@ -175,7 +204,7 @@ MrLogaLoga addresses this by allowing you to attach contextual information to yo
|
|
|
175
204
|
|
|
176
205
|
## Credit
|
|
177
206
|
|
|
178
|
-
This little library was inspired by [Lograge](https://github.com/roidrage/lograge) first and foremost. I would like to thank the amazing [@LenaSchnedlitz](https://twitter.com/LenaSchnedlitz) for the incredible logo! 🤩
|
|
207
|
+
This little library was inspired by [Lograge](https://github.com/roidrage/lograge) first and foremost. Some inspiration was taken from [ougai](https://github.com/tilfin/ougai). I would like to thank the amazing [@LenaSchnedlitz](https://twitter.com/LenaSchnedlitz) for the incredible logo! 🤩
|
|
179
208
|
|
|
180
209
|
## Development
|
|
181
210
|
|
data/lib/mr_loga_loga/context.rb
CHANGED
|
@@ -28,26 +28,29 @@ module MrLogaLoga
|
|
|
28
28
|
# @param context [Hash] the new context
|
|
29
29
|
# @yield the new context
|
|
30
30
|
# @return [Context] a new context object
|
|
31
|
-
def add(severity, message = nil,
|
|
31
|
+
def add(severity, message = nil, context = nil, progname = nil, &block)
|
|
32
32
|
severity ||= UNKNOWN
|
|
33
33
|
return true unless @logger.log?(severity)
|
|
34
34
|
|
|
35
|
+
message, context = LoggerData.build(message, context, &block)
|
|
35
36
|
context = merge_context(@context, context)
|
|
36
37
|
context = context.call if context.is_a?(Proc)
|
|
37
38
|
|
|
38
|
-
@logger.add(severity, message,
|
|
39
|
+
@logger.add(severity, LogMessage.new(message, context), progname, &block)
|
|
39
40
|
end
|
|
40
41
|
|
|
41
42
|
alias log add
|
|
42
43
|
|
|
43
44
|
%i[debug info warn error fatal unknown].each do |symbol|
|
|
44
|
-
define_method(symbol) do |message = nil,
|
|
45
|
+
define_method(symbol) do |message = nil, context = nil, progname = nil, &block|
|
|
45
46
|
severity = Object.const_get("Logger::Severity::#{symbol.to_s.upcase}")
|
|
46
47
|
return true unless @logger.log?(severity)
|
|
47
48
|
|
|
49
|
+
message, context = LoggerData.build(message, context, &block)
|
|
48
50
|
context = merge_context(@context, context)
|
|
49
51
|
context = context.call if context.is_a?(Proc)
|
|
50
|
-
|
|
52
|
+
|
|
53
|
+
@logger.add(severity, LogMessage.new(message, context), progname, &block)
|
|
51
54
|
end
|
|
52
55
|
end
|
|
53
56
|
|
|
@@ -22,9 +22,8 @@ module MrLogaLoga
|
|
|
22
22
|
# @param progname [DateTime] The program name
|
|
23
23
|
# @param message [Object] The log message, which may not be a string
|
|
24
24
|
# @param context [Hash] The log message context
|
|
25
|
-
#
|
|
26
25
|
# @return [String] the formatted log message
|
|
27
|
-
def call(severity, datetime, progname, message,
|
|
26
|
+
def call(severity, datetime, progname, message, context)
|
|
28
27
|
message = message.nil? ? '' : msg2str(message).strip
|
|
29
28
|
|
|
30
29
|
message_hash = {
|
|
@@ -24,8 +24,8 @@ module MrLogaLoga
|
|
|
24
24
|
# @param context [Hash] The log message context
|
|
25
25
|
#
|
|
26
26
|
# @return [String] the formatted log message
|
|
27
|
-
def call(severity, datetime, progname, message,
|
|
28
|
-
message = msg2str(message).strip
|
|
27
|
+
def call(severity, datetime, progname, message, context = {})
|
|
28
|
+
message = message ? msg2str(message).strip : ''
|
|
29
29
|
message = context.map { |key, value| "#{key}=#{value}" }
|
|
30
30
|
.prepend(message)
|
|
31
31
|
.compact
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module MrLogaLoga
|
|
4
|
+
# A structured log message containing the actual message and context
|
|
5
|
+
#
|
|
6
|
+
# @private
|
|
7
|
+
LogMessage = Struct.new(:msg, :context) do
|
|
8
|
+
# Format the log message. This is a fallback for logger exctending MrLogaLoga who do not know how to format
|
|
9
|
+
# LogMessage themselves.
|
|
10
|
+
def inspect
|
|
11
|
+
# This is identical to ActiveRecord::SimpleFormatter
|
|
12
|
+
"#{msg.is_a?(String) ? msg : msg.inspect}\n"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
data/lib/mr_loga_loga/logger.rb
CHANGED
|
@@ -21,44 +21,49 @@ module MrLogaLoga
|
|
|
21
21
|
# logger.context(user: 1).debug('with context')
|
|
22
22
|
#
|
|
23
23
|
class Logger < ::Logger
|
|
24
|
+
alias super_add add
|
|
25
|
+
|
|
24
26
|
def initialize(*args, **kwargs)
|
|
25
27
|
super
|
|
26
28
|
@default_formatter = MrLogaLoga::Formatters::KeyValue.new
|
|
27
29
|
end
|
|
28
30
|
|
|
29
31
|
# Generates a new context
|
|
30
|
-
def context(
|
|
31
|
-
|
|
32
|
-
Context.new(self,
|
|
32
|
+
def context(context = {}, &block)
|
|
33
|
+
result = block ? -> { context.merge(block.call) } : context
|
|
34
|
+
Context.new(self, result)
|
|
33
35
|
end
|
|
34
36
|
|
|
35
37
|
# Adds a new log message with the given severity
|
|
36
|
-
def add(severity, message = nil,
|
|
38
|
+
def add(severity, message = nil, context = nil, progname = nil, &block)
|
|
39
|
+
write(severity, message, context, progname, &block)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Write the actual log data
|
|
43
|
+
#
|
|
44
|
+
# This method needs to be used rather than add as various gems (Rails, Sidekiq) patch loggers to overwrite add. The
|
|
45
|
+
# patches' signatures do not match our add method, so we use this method to do the actual logging in helper methods
|
|
46
|
+
# like debug, info etc.
|
|
47
|
+
#
|
|
48
|
+
def write(severity, *args, &block)
|
|
37
49
|
severity ||= UNKNOWN
|
|
38
50
|
return true unless log?(severity)
|
|
39
51
|
|
|
40
|
-
|
|
52
|
+
message, context, progname = args
|
|
53
|
+
log_message = message.is_a?(LogMessage) ? message : LogMessage.new(*LoggerData.build(message, context, &block))
|
|
41
54
|
|
|
42
|
-
|
|
43
|
-
if block
|
|
44
|
-
message = block.call
|
|
45
|
-
else
|
|
46
|
-
message = progname
|
|
47
|
-
progname = @progname
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
@logdev.write(format(format_severity(severity), Time.now, progname, message, context))
|
|
52
|
-
true
|
|
55
|
+
super_add(severity, log_message, progname)
|
|
53
56
|
end
|
|
54
57
|
|
|
55
58
|
alias log add
|
|
56
59
|
|
|
57
60
|
%i[debug info warn error fatal unknown].each do |symbol|
|
|
58
|
-
define_method(symbol) do |
|
|
61
|
+
define_method(symbol) do |message = nil, context = nil, progname = nil, &block|
|
|
59
62
|
# Map the symbol (e.g. :debug) to the severity constant (e.g. DEBUG)
|
|
60
63
|
severity = Object.const_get("Logger::Severity::#{symbol.to_s.upcase}")
|
|
61
|
-
|
|
64
|
+
message, context = LoggerData.build(message, context, &block)
|
|
65
|
+
|
|
66
|
+
add(severity, LogMessage.new(message, context), progname, &block)
|
|
62
67
|
end
|
|
63
68
|
end
|
|
64
69
|
|
|
@@ -85,8 +90,8 @@ module MrLogaLoga
|
|
|
85
90
|
end
|
|
86
91
|
end
|
|
87
92
|
|
|
88
|
-
def
|
|
89
|
-
(@formatter || @default_formatter).call(severity, datetime, progname, message,
|
|
93
|
+
def format_message(severity, datetime, progname, message)
|
|
94
|
+
(@formatter || @default_formatter).call(severity, datetime, progname, message.msg, message.context)
|
|
90
95
|
end
|
|
91
96
|
end
|
|
92
97
|
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'logger'
|
|
4
|
+
|
|
5
|
+
module MrLogaLoga
|
|
6
|
+
# == Description
|
|
7
|
+
#
|
|
8
|
+
# This class separates message and contextual data from args
|
|
9
|
+
class LoggerData
|
|
10
|
+
class << self
|
|
11
|
+
def build(*args, &block)
|
|
12
|
+
args = block ? block.call : args
|
|
13
|
+
msg, context = args
|
|
14
|
+
if msg.nil?
|
|
15
|
+
[nil, as_hash(context)]
|
|
16
|
+
elsif context.nil?
|
|
17
|
+
msg.is_a?(Hash) ? [nil, msg] : [msg, {}]
|
|
18
|
+
else
|
|
19
|
+
[msg, as_hash(context)]
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def as_hash(data)
|
|
26
|
+
if data.is_a?(Hash) || data.respond_to?(:to_hash)
|
|
27
|
+
data
|
|
28
|
+
elsif !data.nil?
|
|
29
|
+
{ context: data }
|
|
30
|
+
else
|
|
31
|
+
{}
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
data/lib/mr_loga_loga/version.rb
CHANGED
data/lib/mr_loga_loga.rb
CHANGED
|
@@ -2,16 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative 'mr_loga_loga/version'
|
|
4
4
|
require_relative 'mr_loga_loga/configuration'
|
|
5
|
-
require_relative 'mr_loga_loga/logger_proxy'
|
|
6
5
|
require_relative 'mr_loga_loga/instance_methods'
|
|
6
|
+
require_relative 'mr_loga_loga/logger_data'
|
|
7
|
+
require_relative 'mr_loga_loga/log_message'
|
|
7
8
|
require_relative 'mr_loga_loga/context'
|
|
8
9
|
require_relative 'mr_loga_loga/logger'
|
|
9
10
|
require_relative 'mr_loga_loga/formatters/key_value'
|
|
10
11
|
require_relative 'mr_loga_loga/formatters/json'
|
|
11
12
|
|
|
12
|
-
require_relative 'mr_loga_loga/extensions/rails'
|
|
13
|
-
require_relative 'mr_loga_loga/extensions/lograge'
|
|
14
|
-
|
|
15
13
|
# ## Description
|
|
16
14
|
#
|
|
17
15
|
# The MrLogaLoga module provides additional logging functionality when included in your classes.
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mr_loga_loga
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- hschne
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-05-09 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rubocop
|
|
@@ -128,13 +128,12 @@ files:
|
|
|
128
128
|
- lib/mr_loga_loga.rb
|
|
129
129
|
- lib/mr_loga_loga/configuration.rb
|
|
130
130
|
- lib/mr_loga_loga/context.rb
|
|
131
|
-
- lib/mr_loga_loga/extensions/lograge.rb
|
|
132
|
-
- lib/mr_loga_loga/extensions/rails.rb
|
|
133
131
|
- lib/mr_loga_loga/formatters/json.rb
|
|
134
132
|
- lib/mr_loga_loga/formatters/key_value.rb
|
|
135
133
|
- lib/mr_loga_loga/instance_methods.rb
|
|
134
|
+
- lib/mr_loga_loga/log_message.rb
|
|
136
135
|
- lib/mr_loga_loga/logger.rb
|
|
137
|
-
- lib/mr_loga_loga/
|
|
136
|
+
- lib/mr_loga_loga/logger_data.rb
|
|
138
137
|
- lib/mr_loga_loga/version.rb
|
|
139
138
|
- logo.png
|
|
140
139
|
- mr_loga_loga.gemspec
|
|
@@ -161,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
161
160
|
- !ruby/object:Gem::Version
|
|
162
161
|
version: '0'
|
|
163
162
|
requirements: []
|
|
164
|
-
rubygems_version: 3.
|
|
163
|
+
rubygems_version: 3.3.7
|
|
165
164
|
signing_key:
|
|
166
165
|
specification_version: 4
|
|
167
166
|
summary: A bombastic, fantastic logger for Ruby
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module MrLogaLoga
|
|
4
|
-
module Extensions
|
|
5
|
-
# == Description
|
|
6
|
-
#
|
|
7
|
-
# This patches Lograge to forward data as context to MrLogaLoga.
|
|
8
|
-
#
|
|
9
|
-
# We want Lograge to forward requeest data not to it's own formatter and then to the logger, as this would make that
|
|
10
|
-
# data part of the message. Rather, where Lograge normally sends the formatted message to the logger we send the
|
|
11
|
-
# raw data.
|
|
12
|
-
#
|
|
13
|
-
# This effectively circumvents Lograge's formatters.
|
|
14
|
-
#
|
|
15
|
-
# == Patches
|
|
16
|
-
#
|
|
17
|
-
# - Lograge::LogSubscribers#process_main_event
|
|
18
|
-
#
|
|
19
|
-
module LogrageExtension
|
|
20
|
-
class << self
|
|
21
|
-
def apply
|
|
22
|
-
return unless defined?(Lograge)
|
|
23
|
-
|
|
24
|
-
patch_applies = defined?(Lograge::LogSubscribers::Base) &&
|
|
25
|
-
Lograge::LogSubscribers::Base.private_method_defined?(:process_main_event)
|
|
26
|
-
unless patch_applies
|
|
27
|
-
puts "WARNING: Failed to patch Lograge. It looks like MrLogaLoga's patch no longer applies in "\
|
|
28
|
-
"#{__FILE__}. Please contact MrLogaLoga maintainers."
|
|
29
|
-
return
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
Lograge::LogSubscribers::Base.prepend(self)
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def process_main_event(event)
|
|
37
|
-
return if Lograge.ignore?(event)
|
|
38
|
-
|
|
39
|
-
payload = event.payload
|
|
40
|
-
data = extract_request(event, payload)
|
|
41
|
-
data = before_format(data, payload)
|
|
42
|
-
# Instead of
|
|
43
|
-
if logger.is_a?(MrLogaLoga::Logger)
|
|
44
|
-
logger.send(Lograge.log_level, '', **data)
|
|
45
|
-
else
|
|
46
|
-
formatted_message = Lograge.formatter.call(data)
|
|
47
|
-
logger.send(Lograge.log_level, formatted_message)
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
MrLogaLoga::Extensions::LogrageExtension.apply
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module MrLogaLoga
|
|
4
|
-
module Extensions
|
|
5
|
-
# == Description
|
|
6
|
-
#
|
|
7
|
-
# This patches Rails to allow it to work with loggers that accept keyword arguments.
|
|
8
|
-
#
|
|
9
|
-
# Per default, Rails patches any logger during server startup to be able to broadcast any log messages to the
|
|
10
|
-
# console. This patch assumes that loggers only take args and blocks, so we have to change that.
|
|
11
|
-
#
|
|
12
|
-
# During server startup Rails will always use the ActiveSupport::Logger to send data to the console.
|
|
13
|
-
# This was modified o changed to always use the user-configured logger.
|
|
14
|
-
#
|
|
15
|
-
# == Patches
|
|
16
|
-
#
|
|
17
|
-
# - {ActiveSupport::Logger#self.broadcast}
|
|
18
|
-
# - {Rails::Server#log_to_stdout}
|
|
19
|
-
#
|
|
20
|
-
module RailsExtension
|
|
21
|
-
class << self
|
|
22
|
-
def apply
|
|
23
|
-
return unless defined?(Rails)
|
|
24
|
-
|
|
25
|
-
patch_logger
|
|
26
|
-
patch_server
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
def patch_server
|
|
32
|
-
server_defined = defined?(Rails::Server)
|
|
33
|
-
return unless server_defined
|
|
34
|
-
|
|
35
|
-
unless Rails::Server.private_method_defined?(:log_to_stdout)
|
|
36
|
-
puts "WARNING: Failed to patch Rails::Server. It looks like MrLogaLoga's patch in #{__FILE__} no "\
|
|
37
|
-
"longer applies. Please contact MrLogaLoga's maintainers."
|
|
38
|
-
return
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
Rails::Server.prepend(ServerPatch)
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def patch_logger
|
|
45
|
-
logger_defined = defined?(ActiveSupport::Logger)
|
|
46
|
-
return unless logger_defined
|
|
47
|
-
|
|
48
|
-
unless broadcast_method
|
|
49
|
-
puts "WARNING: Failed to patch ActiveSupport::Logger. It looks like MrLogaLoga's patch in #{__FILE__} no "\
|
|
50
|
-
"longer applies. Please contact MrLogaLoga's maintainers."
|
|
51
|
-
return
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
ActiveSupport::Logger.include(LoggerPatch)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def broadcast_method
|
|
58
|
-
broadcast = ActiveSupport::Logger.method(:broadcast)
|
|
59
|
-
broadcast && broadcast.arity == 1
|
|
60
|
-
rescue NameError
|
|
61
|
-
false
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# This patches ActiveSupport::Logger to allow properly formatting keyword arguments
|
|
65
|
-
module LoggerPatch
|
|
66
|
-
# rubocop:disable all
|
|
67
|
-
def included base
|
|
68
|
-
base.instance_eval do
|
|
69
|
-
def broadcast(logger)
|
|
70
|
-
Module.new do
|
|
71
|
-
# We need to patch this method as otherwise calling add with keyword arguments results in argument errors.
|
|
72
|
-
# Rails calls `broadcast` for the logger configured in `Rails.logger`, which means that any invocations of
|
|
73
|
-
# Rails.logger.add result in running through this method.
|
|
74
|
-
#
|
|
75
|
-
# TODO: Remove once patched in Rails
|
|
76
|
-
define_method(:add) do |*args, **kwargs, &block|
|
|
77
|
-
logger.add(*args, **kwargs, &block)
|
|
78
|
-
super(*args, **kwargs, &block)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
define_method(:<<) do |x|
|
|
82
|
-
logger << x
|
|
83
|
-
super(x)
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
define_method(:close) do
|
|
87
|
-
logger.close
|
|
88
|
-
super()
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
define_method(:progname=) do |name|
|
|
92
|
-
logger.progname = name
|
|
93
|
-
super(name)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
define_method(:formatter=) do |formatter|
|
|
97
|
-
logger.formatter = formatter
|
|
98
|
-
super(formatter)
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
define_method(:level=) do |level|
|
|
102
|
-
logger.level = level
|
|
103
|
-
super(level)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
define_method(:local_level=) do |level|
|
|
107
|
-
logger.local_level = level if logger.respond_to?(:local_level=)
|
|
108
|
-
super(level) if respond_to?(:local_level=)
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
define_method(:silence) do |level = Logger::ERROR, &block|
|
|
112
|
-
if logger.respond_to?(:silence)
|
|
113
|
-
logger.silence(level) do
|
|
114
|
-
if defined?(super)
|
|
115
|
-
super(level, &block)
|
|
116
|
-
else
|
|
117
|
-
block.call(self)
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
else
|
|
121
|
-
if defined?(super)
|
|
122
|
-
super(level, &block)
|
|
123
|
-
else
|
|
124
|
-
block.call(self)
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
# rubocpo:enable all
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
# This patches the server command so that console output will use the same logger you previously configured
|
|
136
|
-
module ServerPatch
|
|
137
|
-
def log_to_stdout
|
|
138
|
-
wrapped_app # touch the app so the logger is set up
|
|
139
|
-
|
|
140
|
-
console = Rails.logger.class.new(STDOUT)
|
|
141
|
-
console.formatter = Rails.logger.formatter
|
|
142
|
-
console.level = Rails.logger.level
|
|
143
|
-
|
|
144
|
-
unless ActiveSupport::Logger.logger_outputs_to?(Rails.logger, STDOUT)
|
|
145
|
-
Rails.logger.extend(ActiveSupport::Logger.broadcast(console))
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
MrLogaLoga::Extensions::RailsExtension.apply
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'logger'
|
|
4
|
-
require 'forwardable'
|
|
5
|
-
|
|
6
|
-
module MrLogaLoga
|
|
7
|
-
# == Description
|
|
8
|
-
#
|
|
9
|
-
# A proxy that attaches contextual information to the underlying logger when called.
|
|
10
|
-
#
|
|
11
|
-
# @api private
|
|
12
|
-
class LoggerProxy
|
|
13
|
-
extend Forwardable
|
|
14
|
-
|
|
15
|
-
def initialize(logger, context_proc)
|
|
16
|
-
@logger = logger
|
|
17
|
-
@context_proc = context_proc
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def add(severity, message = nil, progname = nil, **context, &block)
|
|
21
|
-
severity ||= UNKNOWN
|
|
22
|
-
return true unless @logger.log?(severity)
|
|
23
|
-
|
|
24
|
-
context = @context_proc.call.merge(context)
|
|
25
|
-
|
|
26
|
-
@logger.add(severity, message, progname, **context, &block)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
alias log add
|
|
30
|
-
|
|
31
|
-
%i[debug info warn error fatal unknown].each do |symbol|
|
|
32
|
-
def_delegator :@logger, "#{symbol}?".to_sym, "#{symbol}?".to_sym
|
|
33
|
-
|
|
34
|
-
define_method(symbol) do |progname = nil, **context, &block|
|
|
35
|
-
severity = Object.const_get("Logger::Severity::#{symbol.to_s.upcase}")
|
|
36
|
-
add(severity, nil, progname, **context, &block)
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|