memolog 0.1.0 → 0.3.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/.gitignore +2 -0
- data/CHANGELOG.md +21 -2
- data/Gemfile +9 -0
- data/Gemfile.lock +12 -8
- data/README.md +31 -1
- data/lib/memolog/config.rb +12 -3
- data/lib/memolog/init.rb +29 -11
- data/lib/memolog/sentry_scope_extension.rb +4 -2
- data/lib/memolog/sentry_sidekiq_middleware_extension.rb +7 -0
- data/lib/memolog/version.rb +1 -1
- data/lib/memolog.rb +25 -24
- metadata +12 -111
- data/lib/memolog/railtie.rb +0 -7
- data/lib/memolog/sentry_sidekiq_middleware.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e99e3c68b6d46dff6769d0526a9b9638d6ddf479665929a8e03dddb5eeddf618
|
4
|
+
data.tar.gz: f7221b929323ff44066403d01a3f02eefb6dd8302c882a2a78df43776acdc03b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35f308119cb2c44d09974ce1f9fda973e648212aefb36d6256678d0b281de6784be265bc87781b55f3aa05d5a3d6ddfdd60beb86e77420f629fab02e72e87be7
|
7
|
+
data.tar.gz: 3a82f19378b63f47ffcd9ad512ee44a2daa4769ffdaed6b01cd90e867e3cea31c200d264820f91af8307f0e43bb3a2c03944aa0d107bd2beeb6e6464a46cb8c7
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,24 @@
|
|
1
|
-
##
|
1
|
+
## 0.3.0
|
2
2
|
|
3
|
-
|
3
|
+
- Apply a prepend patch with `Sentry::Scope#apply_to_event` method.
|
4
|
+
- Check constant definition via `Object.const_defined?`
|
5
|
+
- Moving `Sentry::Sidekiq` scheme to monkey patch `Sentry::Sidekiq::SentryContextServerMiddleware`
|
6
|
+
- More specs
|
7
|
+
|
8
|
+
## 0.2.2
|
9
|
+
|
10
|
+
- Do not init Rails middleware in Sidekiq server.
|
11
|
+
|
12
|
+
## 0.2.1
|
13
|
+
|
14
|
+
- Better Rails middleware initialization.
|
15
|
+
|
16
|
+
## 0.2.0
|
17
|
+
|
18
|
+
- Uprade gem due [CVE-2021-41098](https://github.com/advisories/GHSA-2rr5-8q37-2w7h)
|
19
|
+
- Add initializers config option, available initializers are [rails, sentry, sidekiq].
|
20
|
+
- Move debug option to config.
|
21
|
+
|
22
|
+
## 0.1.0
|
4
23
|
|
5
24
|
- Test version for publish and test workflow.
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
memolog (0.
|
5
|
-
logger
|
6
|
-
securerandom
|
4
|
+
memolog (0.3.0)
|
5
|
+
logger (~> 1.4.3)
|
6
|
+
securerandom (~> 0.1.0)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
@@ -98,7 +98,7 @@ GEM
|
|
98
98
|
activesupport (>= 5.0)
|
99
99
|
i18n (1.8.10)
|
100
100
|
concurrent-ruby (~> 1.0)
|
101
|
-
logger (1.4.
|
101
|
+
logger (1.4.4)
|
102
102
|
loofah (2.12.0)
|
103
103
|
crass (~> 1.0.2)
|
104
104
|
nokogiri (>= 1.5.9)
|
@@ -110,9 +110,9 @@ GEM
|
|
110
110
|
minitest (5.14.4)
|
111
111
|
multipart-post (2.1.1)
|
112
112
|
nio4r (2.5.8)
|
113
|
-
nokogiri (1.12.
|
113
|
+
nokogiri (1.12.5-x86_64-darwin)
|
114
114
|
racc (~> 1.4)
|
115
|
-
nokogiri (1.12.
|
115
|
+
nokogiri (1.12.5-x86_64-linux)
|
116
116
|
racc (~> 1.4)
|
117
117
|
parallel (1.21.0)
|
118
118
|
parser (3.0.2.0)
|
@@ -177,7 +177,7 @@ GEM
|
|
177
177
|
rubocop-ast (>= 1.7.0, < 2.0)
|
178
178
|
ruby-progressbar (~> 1.7)
|
179
179
|
unicode-display_width (>= 1.4.0, < 3.0)
|
180
|
-
rubocop-ast (1.
|
180
|
+
rubocop-ast (1.12.0)
|
181
181
|
parser (>= 3.0.1.1)
|
182
182
|
rubocop-config-umbrellio (1.17.0.53)
|
183
183
|
rubocop (= 1.17.0)
|
@@ -202,7 +202,7 @@ GEM
|
|
202
202
|
rubocop (~> 1.0)
|
203
203
|
ruby-progressbar (1.11.0)
|
204
204
|
ruby2_keywords (0.0.5)
|
205
|
-
securerandom (0.1.
|
205
|
+
securerandom (0.1.1)
|
206
206
|
sentry-ruby (4.7.3)
|
207
207
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
208
208
|
faraday (>= 1.0)
|
@@ -210,6 +210,9 @@ GEM
|
|
210
210
|
sentry-ruby-core (4.7.3)
|
211
211
|
concurrent-ruby
|
212
212
|
faraday
|
213
|
+
sentry-sidekiq (4.7.3)
|
214
|
+
sentry-ruby-core (~> 4.7.0)
|
215
|
+
sidekiq (>= 3.0)
|
213
216
|
sidekiq (6.2.2)
|
214
217
|
connection_pool (>= 2.2.2)
|
215
218
|
rack (~> 2.0)
|
@@ -242,6 +245,7 @@ DEPENDENCIES
|
|
242
245
|
rspec
|
243
246
|
rubocop-config-umbrellio
|
244
247
|
sentry-ruby
|
248
|
+
sentry-sidekiq
|
245
249
|
sidekiq
|
246
250
|
|
247
251
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -20,10 +20,40 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
$ gem install memolog
|
22
22
|
|
23
|
+
## Configuration
|
24
|
+
|
25
|
+
Use this example during application initialization process (this example implement default values):
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
Memolog.configure do |config|
|
29
|
+
config.debug = false
|
30
|
+
config.formatter = ::Memolog::Formatter.new
|
31
|
+
config.initializers = %i[rails sentry sidekiq]
|
32
|
+
config.log_size_limit = 50_000
|
33
|
+
config.sentry_key = :memolog
|
34
|
+
config.uuid_callable = -> { SecureRandom.uuid }
|
35
|
+
end
|
36
|
+
|
37
|
+
Memolog.init!
|
38
|
+
```
|
39
|
+
|
40
|
+
Available options are:
|
41
|
+
- `debug` - set it to true if you need to leave Memolog.dump result outside `Memolog.run {}` block.
|
42
|
+
- `formatter` - setup your own formatter.
|
43
|
+
- `initializers` - define here what you want to initialize in `#init!` call.
|
44
|
+
- `log_size_limit` - max log length in Sentry event.
|
45
|
+
- `sentry_key` - key name in Sentry extra object.
|
46
|
+
- `uuid_callable` - Memolog add unique value to logs, here you can redefine uuid generation.
|
47
|
+
|
23
48
|
## Usage
|
24
49
|
|
50
|
+
Please call `Memolog.extend_logger(Rails.logger)` or any other logger you want to collect.
|
51
|
+
After that when error occured you can check your Sentry report and see `memolog` section with all
|
52
|
+
logs collected before error. Also there will be unique identifier to find logs behaviour on your
|
53
|
+
server or log collection system.
|
54
|
+
|
25
55
|
Memolog has init code for Rails (Middleware), Sentry (Extension) and Sidekiq (Middleware).
|
26
|
-
It implement all hacks on the
|
56
|
+
It implement all hacks on the `Memolog.init!` call.
|
27
57
|
Also you can add `Memolog.run {}` around logs you want to collect and release it with `Memolog.dump`
|
28
58
|
inside this block.
|
29
59
|
|
data/lib/memolog/config.rb
CHANGED
@@ -1,10 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
Memolog::Config = Struct.new(
|
3
|
+
Memolog::Config = Struct.new(
|
4
|
+
:debug,
|
5
|
+
:formatter,
|
6
|
+
:initializers,
|
7
|
+
:log_size_limit,
|
8
|
+
:sentry_key,
|
9
|
+
:uuid_callable,
|
10
|
+
) do
|
4
11
|
def initialize
|
12
|
+
self.debug = false
|
5
13
|
self.formatter = ::Memolog::Formatter.new
|
6
|
-
self.
|
7
|
-
self.sentry_key = :memolog
|
14
|
+
self.initializers = %i[rails sentry sidekiq]
|
8
15
|
self.log_size_limit = 50_000
|
16
|
+
self.sentry_key = :memolog
|
17
|
+
self.uuid_callable = -> { SecureRandom.uuid }
|
9
18
|
end
|
10
19
|
end
|
data/lib/memolog/init.rb
CHANGED
@@ -1,17 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
class Memolog::Init
|
4
|
+
def call
|
5
|
+
init_rails!
|
6
|
+
init_sentry!
|
7
|
+
init_sidekiq!
|
8
|
+
end
|
6
9
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
+
private
|
11
|
+
|
12
|
+
def init_rails!
|
13
|
+
return unless Memolog.config.initializers.include?(:rails)
|
14
|
+
return unless Object.const_defined?("Rails")
|
15
|
+
return if Object.const_defined?("Sidekiq") && Sidekiq.server?
|
16
|
+
|
17
|
+
Rails.application.middleware.insert_before(0, Memolog::Middleware)
|
18
|
+
end
|
19
|
+
|
20
|
+
def init_sentry!
|
21
|
+
return unless Memolog.config.initializers.include?(:sentry)
|
22
|
+
return unless Object.const_defined?("Sentry::Scope")
|
23
|
+
|
24
|
+
Sentry::Scope.prepend(Memolog::SentryScopeExtension)
|
25
|
+
end
|
26
|
+
|
27
|
+
def init_sidekiq!
|
28
|
+
return unless Memolog.config.initializers.include?(:sidekiq)
|
29
|
+
return unless Object.const_defined?("Sentry::Sidekiq::SentryContextServerMiddleware")
|
10
30
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
chain.prepend(Memolog::SentrySidekiqMiddleware)
|
15
|
-
end
|
31
|
+
Sentry::Sidekiq::SentryContextServerMiddleware.prepend(
|
32
|
+
Memolog::SentrySidekiqMiddlewareExtension,
|
33
|
+
)
|
16
34
|
end
|
17
35
|
end
|
@@ -1,8 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Memolog::SentryScopeExtension
|
4
|
-
def
|
4
|
+
def apply_to_event(scope, hint = nil)
|
5
5
|
memolog_dump = Memolog.dump
|
6
|
-
|
6
|
+
set_extras(Memolog.config.sentry_key => memolog_dump) if memolog_dump
|
7
|
+
|
8
|
+
super
|
7
9
|
end
|
8
10
|
end
|
data/lib/memolog/version.rb
CHANGED
data/lib/memolog.rb
CHANGED
@@ -2,52 +2,55 @@
|
|
2
2
|
|
3
3
|
require "logger"
|
4
4
|
require "securerandom"
|
5
|
+
require "stringio"
|
6
|
+
|
7
|
+
require "memolog/version"
|
8
|
+
require "memolog/config"
|
9
|
+
require "memolog/extension"
|
10
|
+
require "memolog/formatter"
|
11
|
+
require "memolog/init"
|
12
|
+
require "memolog/middleware"
|
13
|
+
require "memolog/sentry_scope_extension"
|
14
|
+
require "memolog/sentry_sidekiq_middleware_extension"
|
5
15
|
|
6
16
|
module Memolog
|
7
17
|
extend self
|
8
18
|
|
9
|
-
|
10
|
-
autoload :Config, "memolog/config"
|
11
|
-
autoload :Extension, "memolog/extension"
|
12
|
-
autoload :Formatter, "memolog/formatter"
|
13
|
-
autoload :Middleware, "memolog/middleware"
|
14
|
-
autoload :SentryScopeExtension, "memolog/sentry_scope_extension"
|
15
|
-
autoload :SentrySidekiqMiddleware, "memolog/sentry_sidekiq_middleware"
|
19
|
+
attr_accessor :config, :logdevs
|
16
20
|
|
17
|
-
|
18
|
-
|
19
|
-
self.debug = false
|
20
|
-
self.logdevs = []
|
21
|
+
@config = Memolog::Config.new
|
22
|
+
@logdevs = []
|
21
23
|
|
22
24
|
def configure
|
23
|
-
|
24
|
-
|
25
|
-
|
25
|
+
yield(config) if block_given?
|
26
|
+
end
|
27
|
+
|
28
|
+
def init!
|
29
|
+
Memolog::Init.new.call
|
26
30
|
end
|
27
|
-
alias config configure
|
28
31
|
|
29
32
|
def extend_logger(other_logger)
|
30
33
|
other_logger.extend(Memolog::Extension)
|
31
34
|
other_logger.formatter = config.formatter
|
32
35
|
end
|
33
36
|
|
34
|
-
def logger
|
35
|
-
Thread.current[:memolog_logger] ||= Logger.new(nil, formatter: config.formatter)
|
36
|
-
end
|
37
|
-
|
38
37
|
def uuid
|
39
38
|
Thread.current[:memolog_uuid]
|
40
39
|
end
|
41
40
|
|
41
|
+
def logger
|
42
|
+
Thread.current[:memolog_logger] ||= Logger.new(nil, formatter: config.formatter)
|
43
|
+
end
|
44
|
+
|
42
45
|
def run
|
43
|
-
Thread.current[:memolog_uuid] =
|
46
|
+
Thread.current[:memolog_uuid] = config.uuid_callable.call
|
44
47
|
|
45
48
|
logdevs.push(StringIO.new)
|
46
49
|
logger.instance_variable_set(:@logdev, logdevs.last)
|
47
50
|
|
48
51
|
yield
|
49
52
|
ensure
|
50
|
-
logdevs.pop unless debug
|
53
|
+
logdevs.pop unless config.debug
|
51
54
|
end
|
52
55
|
|
53
56
|
def dump
|
@@ -56,8 +59,6 @@ module Memolog
|
|
56
59
|
beginning = logdevs.last.string.length - config.log_size_limit
|
57
60
|
beginning = 0 if beginning.negative?
|
58
61
|
|
59
|
-
logdevs.last.string.slice(beginning, config.log_size_limit)
|
62
|
+
logdevs.last.string.slice(beginning, config.log_size_limit).presence
|
60
63
|
end
|
61
64
|
end
|
62
|
-
|
63
|
-
require "memolog/init"
|
metadata
CHANGED
@@ -1,141 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: memolog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stepan Kirushkin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logger
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.4.3
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.4.3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: securerandom
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.1.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: pry
|
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: rails
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rake
|
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
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: rspec
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: rubocop-config-umbrellio
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: sentry-ruby
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: sidekiq
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
40
|
+
version: 0.1.0
|
139
41
|
description: |2
|
140
42
|
Memolog is an in-memory logger, which extend any other logger.
|
141
43
|
Designed to work with Sentry.
|
@@ -163,9 +65,8 @@ files:
|
|
163
65
|
- lib/memolog/formatter.rb
|
164
66
|
- lib/memolog/init.rb
|
165
67
|
- lib/memolog/middleware.rb
|
166
|
-
- lib/memolog/railtie.rb
|
167
68
|
- lib/memolog/sentry_scope_extension.rb
|
168
|
-
- lib/memolog/
|
69
|
+
- lib/memolog/sentry_sidekiq_middleware_extension.rb
|
169
70
|
- lib/memolog/version.rb
|
170
71
|
homepage: https://github.com/skirushkin/memolog
|
171
72
|
licenses:
|
@@ -173,7 +74,7 @@ licenses:
|
|
173
74
|
metadata:
|
174
75
|
homepage_uri: https://github.com/skirushkin/memolog
|
175
76
|
source_code_uri: https://github.com/skirushkin/memolog
|
176
|
-
changelog_uri: https://github.com/skirushkin/memolog
|
77
|
+
changelog_uri: https://github.com/skirushkin/memolog/blob/master/CHANGELOG.md
|
177
78
|
post_install_message:
|
178
79
|
rdoc_options: []
|
179
80
|
require_paths:
|
data/lib/memolog/railtie.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Memolog::SentrySidekiqMiddleware
|
4
|
-
def call(*)
|
5
|
-
Memolog.run do
|
6
|
-
yield
|
7
|
-
rescue => error
|
8
|
-
memolog_dump = Memolog.dump
|
9
|
-
Sentry.set_extras(Memolog.config.sentry_key => memolog_dump) if memolog_dump
|
10
|
-
raise error
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|