timber 2.6.2 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +8 -38
- data/CHANGELOG.md +9 -0
- data/README.md +30 -284
- data/Rakefile +78 -0
- data/lib/timber.rb +6 -6
- data/lib/timber/config.rb +1 -83
- data/lib/timber/config/integrations.rb +1 -47
- data/lib/timber/context.rb +3 -24
- data/lib/timber/contexts.rb +2 -30
- data/lib/timber/contexts/http.rb +16 -36
- data/lib/timber/contexts/release.rb +12 -23
- data/lib/timber/contexts/runtime.rb +9 -36
- data/lib/timber/contexts/session.rb +8 -21
- data/lib/timber/contexts/system.rb +9 -16
- data/lib/timber/contexts/user.rb +13 -33
- data/lib/timber/current_context.rb +16 -78
- data/lib/timber/event.rb +12 -9
- data/lib/timber/events.rb +1 -33
- data/lib/timber/events/controller_call.rb +20 -31
- data/lib/timber/events/error.rb +18 -26
- data/lib/timber/events/exception.rb +1 -0
- data/lib/timber/events/sql_query.rb +14 -24
- data/lib/timber/events/template_render.rb +13 -24
- data/lib/timber/integration.rb +1 -1
- data/lib/timber/integrator.rb +1 -1
- data/lib/timber/log_devices/http.rb +98 -19
- data/lib/timber/log_entry.rb +6 -24
- data/lib/timber/logger.rb +5 -14
- data/lib/timber/util.rb +1 -6
- data/lib/timber/util/non_nil_hash_builder.rb +3 -1
- data/lib/timber/version.rb +1 -1
- data/spec/README.md +2 -8
- data/spec/spec_helper.rb +0 -7
- data/spec/support/timber.rb +1 -3
- data/spec/timber/current_context_spec.rb +12 -50
- data/spec/timber/events/controller_call_spec.rb +4 -4
- data/spec/timber/events/error_spec.rb +4 -9
- data/spec/timber/log_devices/http_spec.rb +26 -2
- data/spec/timber/log_entry_spec.rb +12 -6
- data/spec/timber/logger_spec.rb +27 -68
- data/timber.gemspec +1 -1
- metadata +5 -139
- data/gemfiles/rails-3.0.gemfile +0 -5
- data/gemfiles/rails-3.1.gemfile +0 -5
- data/gemfiles/rails-3.2.gemfile +0 -5
- data/gemfiles/rails-4.0.gemfile +0 -9
- data/gemfiles/rails-4.1.gemfile +0 -9
- data/gemfiles/rails-4.2.gemfile +0 -9
- data/gemfiles/rails-5.0.gemfile +0 -9
- data/gemfiles/rails-5.1.gemfile +0 -9
- data/gemfiles/rails-edge.gemfile +0 -7
- data/lib/timber/cli.rb +0 -60
- data/lib/timber/cli/api.rb +0 -183
- data/lib/timber/cli/api/application.rb +0 -34
- data/lib/timber/cli/config_file.rb +0 -71
- data/lib/timber/cli/file_helper.rb +0 -53
- data/lib/timber/cli/installer.rb +0 -70
- data/lib/timber/cli/installers.rb +0 -102
- data/lib/timber/cli/installers/config_file.rb +0 -51
- data/lib/timber/cli/installers/other.rb +0 -59
- data/lib/timber/cli/installers/rails.rb +0 -225
- data/lib/timber/cli/installers/root.rb +0 -116
- data/lib/timber/cli/io.rb +0 -100
- data/lib/timber/cli/io/ansi.rb +0 -22
- data/lib/timber/cli/io/messages.rb +0 -198
- data/lib/timber/cli/os_helper.rb +0 -74
- data/lib/timber/config/integrations/rack.rb +0 -74
- data/lib/timber/contexts/custom.rb +0 -44
- data/lib/timber/contexts/organization.rb +0 -48
- data/lib/timber/events/custom.rb +0 -53
- data/lib/timber/events/http_request.rb +0 -71
- data/lib/timber/events/http_response.rb +0 -81
- data/lib/timber/frameworks.rb +0 -19
- data/lib/timber/frameworks/rails.rb +0 -27
- data/lib/timber/integrations.rb +0 -29
- data/lib/timber/integrations/action_controller.rb +0 -18
- data/lib/timber/integrations/action_controller/log_subscriber.rb +0 -27
- data/lib/timber/integrations/action_controller/log_subscriber/timber_log_subscriber.rb +0 -46
- data/lib/timber/integrations/action_dispatch.rb +0 -23
- data/lib/timber/integrations/action_dispatch/debug_exceptions.rb +0 -53
- data/lib/timber/integrations/action_view.rb +0 -18
- data/lib/timber/integrations/action_view/log_subscriber.rb +0 -27
- data/lib/timber/integrations/action_view/log_subscriber/timber_log_subscriber.rb +0 -83
- data/lib/timber/integrations/active_record.rb +0 -18
- data/lib/timber/integrations/active_record/log_subscriber.rb +0 -26
- data/lib/timber/integrations/active_record/log_subscriber/timber_log_subscriber.rb +0 -53
- data/lib/timber/integrations/rack.rb +0 -27
- data/lib/timber/integrations/rack/error_event.rb +0 -64
- data/lib/timber/integrations/rack/http_context.rb +0 -27
- data/lib/timber/integrations/rack/http_events.rb +0 -210
- data/lib/timber/integrations/rack/middleware.rb +0 -28
- data/lib/timber/integrations/rack/session_context.rb +0 -65
- data/lib/timber/integrations/rack/user_context.rb +0 -135
- data/lib/timber/integrations/rails.rb +0 -22
- data/lib/timber/integrations/rails/rack_logger.rb +0 -60
- data/lib/timber/overrides.rb +0 -12
- data/lib/timber/overrides/active_support_3_tagged_logging.rb +0 -111
- data/lib/timber/overrides/active_support_buffered_logger.rb +0 -22
- data/lib/timber/overrides/active_support_tagged_logging.rb +0 -66
- data/lib/timber/overrides/lograge.rb +0 -18
- data/lib/timber/overrides/rails_stdout_logging.rb +0 -21
- data/lib/timber/util/active_support_log_subscriber.rb +0 -37
- data/lib/timber/util/attribute_normalizer.rb +0 -89
- data/lib/timber/util/hash.rb +0 -90
- data/lib/timber/util/request.rb +0 -72
- data/lib/timber/util/struct.rb +0 -16
- data/spec/rails/tagged_logging_spec.rb +0 -44
- data/spec/support/action_controller.rb +0 -8
- data/spec/support/active_record.rb +0 -32
- data/spec/support/rails.rb +0 -67
- data/spec/support/rails/templates/_partial.html +0 -1
- data/spec/support/rails/templates/template.html +0 -1
- data/spec/timber/cli/config_file_spec.rb +0 -26
- data/spec/timber/cli/installers/config_file_spec.rb +0 -36
- data/spec/timber/cli/installers/other_spec.rb +0 -49
- data/spec/timber/cli/installers/rails_spec.rb +0 -364
- data/spec/timber/cli/installers/root_spec.rb +0 -73
- data/spec/timber/config_spec.rb +0 -28
- data/spec/timber/contexts/custom_spec.rb +0 -11
- data/spec/timber/contexts/organization_spec.rb +0 -11
- data/spec/timber/contexts/runtime_spec.rb +0 -11
- data/spec/timber/contexts/system_spec.rb +0 -11
- data/spec/timber/contexts/user_spec.rb +0 -11
- data/spec/timber/contexts_spec.rb +0 -49
- data/spec/timber/event_spec.rb +0 -10
- data/spec/timber/events/custom_spec.rb +0 -36
- data/spec/timber/events/http_request_spec.rb +0 -32
- data/spec/timber/events/http_response_spec.rb +0 -12
- data/spec/timber/events_spec.rb +0 -55
- data/spec/timber/integrations/action_controller/log_subscriber_spec.rb +0 -55
- data/spec/timber/integrations/action_dispatch/debug_exceptions_spec.rb +0 -53
- data/spec/timber/integrations/action_view/log_subscriber_spec.rb +0 -115
- data/spec/timber/integrations/active_record/log_subscriber_spec.rb +0 -46
- data/spec/timber/integrations/rack/error_event_spec.rb +0 -63
- data/spec/timber/integrations/rack/http_context_spec.rb +0 -60
- data/spec/timber/integrations/rack/http_events_spec.rb +0 -101
- data/spec/timber/integrations/rack/session_context_spec.rb +0 -62
- data/spec/timber/integrations/rails/rack_logger_spec.rb +0 -58
- data/spec/timber/util/attribute_normalizer_spec.rb +0 -90
- data/spec/timber/util/hash_spec.rb +0 -30
- data/spec/timber/util/request_spec.rb +0 -10
data/lib/timber.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
# Base (must come first, order matters)
|
2
2
|
require "timber/version"
|
3
|
-
require "timber/overrides"
|
4
3
|
require "timber/config"
|
5
4
|
require "timber/util"
|
6
5
|
|
6
|
+
# Load frameworks
|
7
|
+
|
7
8
|
# Other (sorted alphabetically)
|
8
9
|
require "timber/contexts"
|
9
10
|
require "timber/current_context"
|
10
11
|
require "timber/events"
|
12
|
+
require "timber/integration"
|
11
13
|
require "timber/log_devices"
|
12
14
|
require "timber/log_entry"
|
13
15
|
require "timber/logger"
|
14
|
-
require "timber/integrations"
|
15
16
|
require "timber/timer"
|
16
|
-
|
17
|
-
|
18
|
-
require "timber/frameworks"
|
17
|
+
require "timber/integrator"
|
18
|
+
require "timber/integration"
|
19
19
|
|
20
20
|
module Timber
|
21
21
|
# Access the main configuration object. Please see {{Timber::Config}} for more details.
|
@@ -33,4 +33,4 @@ module Timber
|
|
33
33
|
def self.with_context(context, &block)
|
34
34
|
CurrentContext.with(context, &block)
|
35
35
|
end
|
36
|
-
end
|
36
|
+
end
|
data/lib/timber/config.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
require "logger"
|
2
2
|
require "singleton"
|
3
3
|
|
4
|
-
require "timber/config/integrations"
|
5
|
-
|
6
4
|
module Timber
|
7
5
|
# Singleton class for reading and setting Timber configuration.
|
8
6
|
#
|
@@ -25,7 +23,6 @@ module Timber
|
|
25
23
|
end
|
26
24
|
end
|
27
25
|
|
28
|
-
DEFAULT_HTTP_BODY_LIMIT = 2048.freeze
|
29
26
|
DEVELOPMENT_NAME = "development".freeze
|
30
27
|
PRODUCTION_NAME = "production".freeze
|
31
28
|
STAGING_NAME = "staging".freeze
|
@@ -35,11 +32,6 @@ module Timber
|
|
35
32
|
|
36
33
|
attr_writer :http_body_limit
|
37
34
|
|
38
|
-
# @private
|
39
|
-
def initialize
|
40
|
-
@http_body_limit = DEFAULT_HTTP_BODY_LIMIT
|
41
|
-
end
|
42
|
-
|
43
35
|
# Convenience method for logging debug statements to the debug logger
|
44
36
|
# set in this class.
|
45
37
|
# @private
|
@@ -112,39 +104,6 @@ module Timber
|
|
112
104
|
@environment ||= ENV["RACK_ENV"] || ENV["RAILS_ENV"] || "development"
|
113
105
|
end
|
114
106
|
|
115
|
-
# This is a list of header keys that should be filtered. Note, all headers are
|
116
|
-
# normalized to down-case. So please _only_ pass down-cased headers.
|
117
|
-
#
|
118
|
-
# @example Rails
|
119
|
-
# # config/environments/production.rb
|
120
|
-
# config.timber.header_filter_headers += ['api-key']
|
121
|
-
def http_header_filters=(value)
|
122
|
-
@http_header_filters = value
|
123
|
-
end
|
124
|
-
|
125
|
-
# Accessor method for {#http_header_filters=}
|
126
|
-
def http_header_filters
|
127
|
-
@http_header_filters ||= []
|
128
|
-
end
|
129
|
-
|
130
|
-
# Truncates captured HTTP bodies to this specified limit. The default is `2048`.
|
131
|
-
# If you want to capture more data, you can raise this to a maximum of `8192`,
|
132
|
-
# or lower this to be more efficient with data. `2048` characters should give you a good
|
133
|
-
# idea of the body content.
|
134
|
-
#
|
135
|
-
# @example Rails
|
136
|
-
# config.timber.http_body_limit = 2048
|
137
|
-
# @example Everything else
|
138
|
-
# Timber::Config.instance.http_body_limit = 2048
|
139
|
-
def http_body_limit=(value)
|
140
|
-
@http_body_limit = value
|
141
|
-
end
|
142
|
-
|
143
|
-
# Accessor method for {#http_body_limit=}
|
144
|
-
def http_body_limit
|
145
|
-
@http_body_limit
|
146
|
-
end
|
147
|
-
|
148
107
|
# Convenience method for accessing the various `Timber::Integrations::*` class
|
149
108
|
# settings. These provides settings for enabling, disabled, and silencing integrations.
|
150
109
|
# See {Integrations} for a full list of available methods.
|
@@ -152,47 +111,6 @@ module Timber
|
|
152
111
|
Integrations
|
153
112
|
end
|
154
113
|
|
155
|
-
# A convenience method that automatically sets Timber's configuration to closely match
|
156
|
-
# the behavior of the ruby lograge library. This makes it easier when transitioning
|
157
|
-
# from lograge.
|
158
|
-
#
|
159
|
-
# It turns this:
|
160
|
-
#
|
161
|
-
# Started GET "/" for 127.0.0.1 at 2012-03-10 14:28:14 +0100
|
162
|
-
# Processing by HomeController#index as HTML
|
163
|
-
# Rendered text template within layouts/application (0.0ms)
|
164
|
-
# Rendered layouts/_assets.html.erb (2.0ms)
|
165
|
-
# Rendered layouts/_top.html.erb (2.6ms)
|
166
|
-
# Rendered layouts/_about.html.erb (0.3ms)
|
167
|
-
# Rendered layouts/_google_analytics.html.erb (0.4ms)
|
168
|
-
# Completed 200 OK in 79ms (Views: 78.8ms | ActiveRecord: 0.0ms)
|
169
|
-
#
|
170
|
-
# Into this:
|
171
|
-
#
|
172
|
-
# Get "/" sent 200 OK in 79ms @metadata {...}
|
173
|
-
#
|
174
|
-
# In other words it:
|
175
|
-
#
|
176
|
-
# 1. Silences ActiveRecord SQL query logs.
|
177
|
-
# 2. Silences ActiveView template rendering logs.
|
178
|
-
# 3. Silences ActionController controller call logs.
|
179
|
-
# 4. Collapses HTTP request and response logs into a single event.
|
180
|
-
#
|
181
|
-
# Notice also that is is not exactly like lograge. This is intentional. Lograge has
|
182
|
-
# a number of downsides:
|
183
|
-
#
|
184
|
-
# 1. The attribute names (`method`, `format`, `status`, `db`, etc) are too generalized and vague.
|
185
|
-
# This makes it _very_ likely that it will clash with other structured data you're
|
186
|
-
# logging.
|
187
|
-
# 2. It doesn't support context making it near impossible to view in-app logs generated for
|
188
|
-
# the same request.
|
189
|
-
def logrageify!
|
190
|
-
integrations.action_controller.silence = true
|
191
|
-
integrations.action_view.silence = true
|
192
|
-
integrations.active_record.silence = true
|
193
|
-
integrations.rack.http_events.collapse_into_single_event = true
|
194
|
-
end
|
195
|
-
|
196
114
|
# This is the _main_ logger Timber writes to. All of the Timber integrations write to
|
197
115
|
# this logger instance. It should be set to your global logger. For Rails, this is set
|
198
116
|
# automatically to `Rails.logger`, you should not have to set this.
|
@@ -233,4 +151,4 @@ module Timber
|
|
233
151
|
environment == STAGING_NAME
|
234
152
|
end
|
235
153
|
end
|
236
|
-
end
|
154
|
+
end
|
@@ -1,9 +1,3 @@
|
|
1
|
-
require "timber/config/integrations/rack"
|
2
|
-
require "timber/integrations/action_controller"
|
3
|
-
require "timber/integrations/action_view"
|
4
|
-
require "timber/integrations/active_record"
|
5
|
-
require "timber/integrations/rack"
|
6
|
-
|
7
1
|
module Timber
|
8
2
|
class Config
|
9
3
|
# Convenience module for accessing the various `Timber::Integrations::*` classes
|
@@ -18,46 +12,6 @@ module Timber
|
|
18
12
|
# config.integrations.active_record.silence = true
|
19
13
|
module Integrations
|
20
14
|
extend self
|
21
|
-
|
22
|
-
# Convenience method for accessing the {Timber::Integrations::ActionController} class
|
23
|
-
# specific configuration.
|
24
|
-
#
|
25
|
-
# @example
|
26
|
-
# config = Timber::Config.instance
|
27
|
-
# config.integrations.action_controller.silence = true
|
28
|
-
def action_controller
|
29
|
-
Timber::Integrations::ActionController
|
30
|
-
end
|
31
|
-
|
32
|
-
# Convenience method for accessing the {Timber::Integrations::ActionView} class
|
33
|
-
# specific configuration.
|
34
|
-
#
|
35
|
-
# @example
|
36
|
-
# config = Timber::Config.instance
|
37
|
-
# config.integrations.action_view.silence = true
|
38
|
-
def action_view
|
39
|
-
Timber::Integrations::ActionView
|
40
|
-
end
|
41
|
-
|
42
|
-
# Convenience method for accessing the {Timber::Integrations::ActiveRecord} class
|
43
|
-
# specific configuration.
|
44
|
-
#
|
45
|
-
# @example
|
46
|
-
# config = Timber::Config.instance
|
47
|
-
# config.integrations.active_record.silence = true
|
48
|
-
def active_record
|
49
|
-
Timber::Integrations::ActiveRecord
|
50
|
-
end
|
51
|
-
|
52
|
-
# Convenience method for accessing the various `Timber::Integrations::Rack::*`
|
53
|
-
# classes. See {Rack} for a list of methods available.
|
54
|
-
#
|
55
|
-
# @example
|
56
|
-
# config = Timber::Config.instance
|
57
|
-
# config.integrations.rack.http_events.enabled = true
|
58
|
-
def rack
|
59
|
-
Rack
|
60
|
-
end
|
61
15
|
end
|
62
16
|
end
|
63
|
-
end
|
17
|
+
end
|
data/lib/timber/context.rb
CHANGED
@@ -2,29 +2,8 @@ module Timber
|
|
2
2
|
# Base class for all `Timber::Contexts::*` classes.
|
3
3
|
# @private
|
4
4
|
class Context
|
5
|
-
|
6
|
-
|
7
|
-
# For example:
|
8
|
-
#
|
9
|
-
# {:build => {:version => "1.0.0"}}
|
10
|
-
#
|
11
|
-
# The keyspace in the above context is `:build`. This is required
|
12
|
-
# because it prevents key name conflicts. Without the keyspace
|
13
|
-
# it very possible another context type might also have a `:version`
|
14
|
-
# attribute.
|
15
|
-
def keyspace
|
16
|
-
@keyspace || raise(NotImplementedError.new)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
# Returns a simple structure sufficient for encoding. We use
|
21
|
-
# `as_json` as the name since this is a ruby pattern.
|
22
|
-
def as_json(options = {})
|
23
|
-
raise NotImplementedError.new
|
24
|
-
end
|
25
|
-
|
26
|
-
def keyspace
|
27
|
-
self.class.keyspace
|
5
|
+
def to_hash
|
6
|
+
raise(NotImplementedError.new)
|
28
7
|
end
|
29
8
|
end
|
30
|
-
end
|
9
|
+
end
|
data/lib/timber/contexts.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require "timber/contexts/custom"
|
2
1
|
require "timber/contexts/http"
|
3
|
-
require "timber/contexts/organization"
|
4
2
|
require "timber/contexts/release"
|
5
3
|
require "timber/contexts/runtime"
|
6
4
|
require "timber/contexts/session"
|
@@ -8,33 +6,7 @@ require "timber/contexts/system"
|
|
8
6
|
require "timber/contexts/user"
|
9
7
|
|
10
8
|
module Timber
|
11
|
-
#
|
9
|
+
# @private
|
12
10
|
module Contexts
|
13
|
-
# Protocol for casting objects into a {Timber::Context}.
|
14
|
-
#
|
15
|
-
# @example Casting a hash
|
16
|
-
# Timber::Contexts.build(deploy: {version: "1.0.0"})
|
17
|
-
def self.build(obj)
|
18
|
-
if obj.is_a?(::Timber::Context)
|
19
|
-
obj
|
20
|
-
elsif obj.respond_to?(:to_timber_context)
|
21
|
-
obj.to_timber_context
|
22
|
-
elsif obj.is_a?(Hash) && obj.length == 1
|
23
|
-
type = obj.keys.first
|
24
|
-
data = obj.values.first
|
25
|
-
|
26
|
-
Contexts::Custom.new(
|
27
|
-
type: type,
|
28
|
-
data: data
|
29
|
-
)
|
30
|
-
elsif obj.is_a?(Struct) && obj.respond_to?(:type)
|
31
|
-
Contexts::Custom.new(
|
32
|
-
type: obj.type,
|
33
|
-
data: obj.respond_to?(:to_h) ? obj.to_h : Timber::Util::Struct.to_hash(obj) # ruby 1.9.3 does not have to_h
|
34
|
-
)
|
35
|
-
else
|
36
|
-
nil
|
37
|
-
end
|
38
|
-
end
|
39
11
|
end
|
40
|
-
end
|
12
|
+
end
|
data/lib/timber/contexts/http.rb
CHANGED
@@ -2,50 +2,30 @@ require "timber/context"
|
|
2
2
|
|
3
3
|
module Timber
|
4
4
|
module Contexts
|
5
|
-
#
|
6
|
-
# This allows you to tail and filter by this data. A very useful piece of data this
|
7
|
-
# captures is the request ID. This gives you the ability to trace requests and view logs
|
8
|
-
# for a specific request only. For example, say you've searched your logs and found the
|
9
|
-
# specific line you are looking for, but it lacks context. With Timber you can simply
|
10
|
-
# click the request ID and "zoom out" to view all logs for that request. This gives you
|
11
|
-
# complete picture of how the log line in questio was generated.
|
12
|
-
#
|
13
|
-
# @note This context should be installed automatically through the,
|
14
|
-
# {Intregrations::Rack::HTTPContext} Rack middleware.
|
5
|
+
# @private
|
15
6
|
class HTTP < Context
|
16
|
-
HOST_MAX_BYTES = 256.freeze
|
17
|
-
METHOD_MAX_BYTES = 20.freeze
|
18
|
-
PATH_MAX_BYTES = 2048.freeze
|
19
|
-
REMOTE_ADDR_MAX_BYTES = 256.freeze
|
20
|
-
REQUEST_ID_MAX_BYTES = 256.freeze
|
21
|
-
|
22
|
-
@keyspace = :http
|
23
|
-
|
24
7
|
attr_reader :host, :method, :path, :remote_addr, :request_id
|
25
8
|
|
26
9
|
def initialize(attributes)
|
27
|
-
|
28
|
-
@
|
29
|
-
@
|
30
|
-
@
|
31
|
-
@
|
32
|
-
@request_id = normalizer.fetch(:request_id, :string, :limit => REQUEST_ID_MAX_BYTES)
|
10
|
+
@host = attributes[:host]
|
11
|
+
@method = attributes[:method]
|
12
|
+
@path = attributes[:path]
|
13
|
+
@remote_addr = attributes[:remote_addr]
|
14
|
+
@request_id = attributes[:request_id]
|
33
15
|
end
|
34
16
|
|
35
17
|
# Builds a hash representation containing simple objects, suitable for serialization (JSON).
|
36
18
|
def to_hash
|
37
|
-
@to_hash ||=
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
def as_json(_options = {})
|
47
|
-
to_hash
|
19
|
+
@to_hash ||= {
|
20
|
+
http: Util::NonNilHashBuilder.build do |h|
|
21
|
+
h.add(:host, host)
|
22
|
+
h.add(:method, method)
|
23
|
+
h.add(:path, path)
|
24
|
+
h.add(:remote_addr, remote_addr)
|
25
|
+
h.add(:request_id, request_id)
|
26
|
+
end
|
27
|
+
}
|
48
28
|
end
|
49
29
|
end
|
50
30
|
end
|
51
|
-
end
|
31
|
+
end
|
@@ -4,16 +4,8 @@ require "timber/util"
|
|
4
4
|
|
5
5
|
module Timber
|
6
6
|
module Contexts
|
7
|
-
#
|
8
|
-
#
|
9
|
-
# @note To automatically set this context, see {.from_env}.
|
7
|
+
# @private
|
10
8
|
class Release < Context
|
11
|
-
COMMIT_HASH_MAX_BYTES = 256.freeze
|
12
|
-
CREATED_AT_MAX_BYTES = 256.freeze
|
13
|
-
VERSION_MAX_BYTES = 256.freeze
|
14
|
-
|
15
|
-
@keyspace = :release
|
16
|
-
|
17
9
|
class << self
|
18
10
|
# Builds a release context based on environment variables. Simply add the
|
19
11
|
# `RELEASE_COMMIT`, `RELEASE_CREATED_AT`, or the `RELEASE_VERSION` env vars
|
@@ -40,24 +32,21 @@ module Timber
|
|
40
32
|
attr_reader :commit_hash, :created_at, :version
|
41
33
|
|
42
34
|
def initialize(attributes)
|
43
|
-
|
44
|
-
@
|
45
|
-
@
|
46
|
-
@version = normalizer.fetch(:version, :string, :limit => VERSION_MAX_BYTES)
|
35
|
+
@commit_hash = attributes[:commit_hash]
|
36
|
+
@created_at = attributes[:created_at]
|
37
|
+
@version = attributes[:version]
|
47
38
|
end
|
48
39
|
|
49
40
|
# Builds a hash representation containing simple objects, suitable for serialization (JSON).
|
50
41
|
def to_hash
|
51
|
-
@to_hash ||=
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
def as_json(_options = {})
|
59
|
-
to_hash
|
42
|
+
@to_hash ||= {
|
43
|
+
release: Util::NonNilHashBuilder.build do |h|
|
44
|
+
h.add(:commit_hash, commit_hash)
|
45
|
+
h.add(:created_at, created_at)
|
46
|
+
h.add(:version, version)
|
47
|
+
end
|
48
|
+
}
|
60
49
|
end
|
61
50
|
end
|
62
51
|
end
|
63
|
-
end
|
52
|
+
end
|
@@ -2,49 +2,22 @@ require "timber/context"
|
|
2
2
|
|
3
3
|
module Timber
|
4
4
|
module Contexts
|
5
|
-
#
|
6
|
-
# class or module name, etc. This makes it easy to tail and search your logs by their
|
7
|
-
# origin in your code. For example, if you are debugging a specific class, you can narrow
|
8
|
-
# by that class and see only it's logs.
|
5
|
+
# @private
|
9
6
|
class Runtime < Context
|
10
|
-
|
11
|
-
CLASS_NAME_MAX_BYTES = 256.freeze
|
12
|
-
FILE_MAX_BYTES = 1024.freeze
|
13
|
-
FUNCTION_MAX_BYTES = 256.freeze
|
14
|
-
MODULE_NAME_MAX_BYTES = 256.freeze
|
15
|
-
VM_PID_MAX_BYTES = 256.freeze
|
16
|
-
|
17
|
-
@keyspace = :runtime
|
18
|
-
|
19
|
-
attr_reader :application, :class_name, :file, :function, :line, :module_name, :vm_pid
|
7
|
+
attr_reader :thread_id
|
20
8
|
|
21
9
|
def initialize(attributes)
|
22
|
-
|
23
|
-
@application = normalizer.fetch(:application, :string, :limit => APPLICATION_MAX_BYTES)
|
24
|
-
@class_name = normalizer.fetch(:class_name, :string, :limit => CLASS_NAME_MAX_BYTES)
|
25
|
-
@file = normalizer.fetch(:file, :string, :limit => FILE_MAX_BYTES)
|
26
|
-
@function = normalizer.fetch(:function, :string, :limit => FUNCTION_MAX_BYTES)
|
27
|
-
@line = normalizer.fetch(:line, :integer)
|
28
|
-
@module_name = normalizer.fetch(:module_name, :string, :limit => MODULE_NAME_MAX_BYTES)
|
29
|
-
@vm_pid = normalizer.fetch(:vm_pid, :string, :limit => VM_PID_MAX_BYTES)
|
10
|
+
@thread_id = attributes[:thread_id]
|
30
11
|
end
|
31
12
|
|
32
13
|
# Builds a hash representation containing simple objects, suitable for serialization (JSON).
|
33
14
|
def to_hash
|
34
|
-
@to_hash ||=
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
h.add(:line, line)
|
40
|
-
h.add(:module_name, module_name)
|
41
|
-
h.add(:vm_pid, vm_pid)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def as_json(_options = {})
|
46
|
-
to_hash
|
15
|
+
@to_hash ||= {
|
16
|
+
runtime: Util::NonNilHashBuilder.build do |h|
|
17
|
+
h.add(:thread_id, thread_id)
|
18
|
+
end
|
19
|
+
}
|
47
20
|
end
|
48
21
|
end
|
49
22
|
end
|
50
|
-
end
|
23
|
+
end
|