rails_semantic_logger 4.1.3 → 4.12.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 +5 -5
- data/README.md +17 -10
- data/Rakefile +9 -9
- data/lib/rails_semantic_logger/action_controller/log_subscriber.rb +125 -0
- data/lib/rails_semantic_logger/action_mailer/log_subscriber.rb +135 -0
- data/lib/rails_semantic_logger/action_view/log_subscriber.rb +111 -0
- data/lib/rails_semantic_logger/active_job/log_subscriber.rb +126 -0
- data/lib/rails_semantic_logger/active_record/log_subscriber.rb +218 -0
- data/lib/rails_semantic_logger/delayed_job/plugin.rb +11 -0
- data/lib/rails_semantic_logger/engine.rb +189 -194
- data/lib/rails_semantic_logger/extensions/action_cable/tagged_logger_proxy.rb +1 -1
- data/lib/rails_semantic_logger/extensions/action_controller/live.rb +8 -4
- data/lib/rails_semantic_logger/extensions/action_dispatch/debug_exceptions.rb +11 -7
- data/lib/rails_semantic_logger/extensions/action_view/streaming_template_renderer.rb +10 -6
- data/lib/rails_semantic_logger/extensions/active_job/logging.rb +10 -6
- data/lib/rails_semantic_logger/extensions/active_model_serializers/logging.rb +12 -9
- data/lib/rails_semantic_logger/extensions/active_support/logger.rb +24 -0
- data/lib/rails_semantic_logger/extensions/active_support/tagged_logging.rb +8 -0
- data/lib/rails_semantic_logger/extensions/mongoid/config.rb +11 -0
- data/lib/rails_semantic_logger/extensions/rack/server.rb +12 -0
- data/lib/rails_semantic_logger/extensions/rails/server.rb +9 -5
- data/lib/rails_semantic_logger/options.rb +122 -0
- data/lib/rails_semantic_logger/rack/logger.rb +100 -0
- data/lib/rails_semantic_logger/version.rb +2 -2
- data/lib/rails_semantic_logger.rb +58 -3
- metadata +46 -24
- data/lib/rails_semantic_logger/extensions/action_controller/log_subscriber.rb +0 -107
- data/lib/rails_semantic_logger/extensions/action_controller/log_subscriber_processing.rb +0 -28
- data/lib/rails_semantic_logger/extensions/action_view/log_subscriber.rb +0 -12
- data/lib/rails_semantic_logger/extensions/active_record/log_subscriber.rb +0 -44
- data/lib/rails_semantic_logger/extensions/rails/rack/logger.rb +0 -63
- data/lib/rails_semantic_logger/extensions/rails/rack/logger_info_as_debug.rb +0 -30
@@ -0,0 +1,218 @@
|
|
1
|
+
module RailsSemanticLogger
|
2
|
+
module ActiveRecord
|
3
|
+
class LogSubscriber < ActiveSupport::LogSubscriber
|
4
|
+
IGNORE_PAYLOAD_NAMES = %w[SCHEMA EXPLAIN].freeze
|
5
|
+
|
6
|
+
class << self
|
7
|
+
attr_reader :logger
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.runtime=(value)
|
11
|
+
::ActiveRecord::RuntimeRegistry.sql_runtime = value
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.runtime
|
15
|
+
::ActiveRecord::RuntimeRegistry.sql_runtime ||= 0
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.reset_runtime
|
19
|
+
rt = runtime
|
20
|
+
self.runtime = 0
|
21
|
+
rt
|
22
|
+
end
|
23
|
+
|
24
|
+
def sql(event)
|
25
|
+
self.class.runtime += event.duration
|
26
|
+
return unless logger.debug?
|
27
|
+
|
28
|
+
payload = event.payload
|
29
|
+
name = payload[:name]
|
30
|
+
return if IGNORE_PAYLOAD_NAMES.include?(name)
|
31
|
+
|
32
|
+
log_payload = {sql: payload[:sql]}
|
33
|
+
log_payload[:binds] = bind_values(payload) unless (payload[:binds] || []).empty?
|
34
|
+
log_payload[:allocations] = event.allocations if event.respond_to?(:allocations)
|
35
|
+
log_payload[:cached] = event.payload[:cached]
|
36
|
+
|
37
|
+
log = {
|
38
|
+
message: name,
|
39
|
+
payload: log_payload,
|
40
|
+
duration: event.duration
|
41
|
+
}
|
42
|
+
|
43
|
+
# Log the location of the query itself.
|
44
|
+
if logger.send(:level_index) >= SemanticLogger.backtrace_level_index
|
45
|
+
log[:backtrace] = SemanticLogger::Utils.strip_backtrace(caller)
|
46
|
+
end
|
47
|
+
|
48
|
+
logger.debug(log)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
@logger = SemanticLogger["ActiveRecord"]
|
54
|
+
|
55
|
+
# When multiple values are received for a single bound field, it is converted into an array
|
56
|
+
def add_bind_value(binds, key, value)
|
57
|
+
key = key.downcase.to_sym unless key.nil?
|
58
|
+
value = (Array(binds[key]) << value) if binds.key?(key)
|
59
|
+
binds[key] = value
|
60
|
+
end
|
61
|
+
|
62
|
+
def logger
|
63
|
+
self.class.logger
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
# Rails 3,4,5 hell trying to get the bind values
|
68
|
+
#
|
69
|
+
|
70
|
+
def bind_values_v3(payload)
|
71
|
+
binds = {}
|
72
|
+
payload[:binds].each do |col, v|
|
73
|
+
if col
|
74
|
+
add_bind_value(binds, col.name, v)
|
75
|
+
else
|
76
|
+
binds[nil] = v
|
77
|
+
end
|
78
|
+
end
|
79
|
+
binds
|
80
|
+
end
|
81
|
+
|
82
|
+
def bind_values_v4(payload)
|
83
|
+
binds = {}
|
84
|
+
payload[:binds].each do |col, v|
|
85
|
+
attr_name, value = render_bind(col, v)
|
86
|
+
add_bind_value(binds, attr_name, value)
|
87
|
+
end
|
88
|
+
binds
|
89
|
+
end
|
90
|
+
|
91
|
+
def bind_values_v5_0_0(payload)
|
92
|
+
binds = {}
|
93
|
+
payload[:binds].each do |attr|
|
94
|
+
attr_name, value = render_bind(attr)
|
95
|
+
add_bind_value(binds, attr_name, value)
|
96
|
+
end
|
97
|
+
binds
|
98
|
+
end
|
99
|
+
|
100
|
+
def bind_values_v5_0_3(payload)
|
101
|
+
binds = {}
|
102
|
+
casted_params = type_casted_binds(payload[:binds], payload[:type_casted_binds])
|
103
|
+
payload[:binds].zip(casted_params).map do |attr, value|
|
104
|
+
attr_name, value = render_bind(attr, value)
|
105
|
+
add_bind_value(binds, attr_name, value)
|
106
|
+
end
|
107
|
+
binds
|
108
|
+
end
|
109
|
+
|
110
|
+
def bind_values_v5_1_5(payload)
|
111
|
+
binds = {}
|
112
|
+
casted_params = type_casted_binds(payload[:type_casted_binds])
|
113
|
+
payload[:binds].zip(casted_params).map do |attr, value|
|
114
|
+
attr_name, value = render_bind(attr, value)
|
115
|
+
add_bind_value(binds, attr_name, value)
|
116
|
+
end
|
117
|
+
binds
|
118
|
+
end
|
119
|
+
|
120
|
+
def bind_values_v6_1(payload)
|
121
|
+
binds = {}
|
122
|
+
casted_params = type_casted_binds(payload[:type_casted_binds])
|
123
|
+
payload[:binds].each_with_index do |attr, i|
|
124
|
+
attr_name, value = render_bind(attr, casted_params[i])
|
125
|
+
add_bind_value(binds, attr_name, value)
|
126
|
+
end
|
127
|
+
binds
|
128
|
+
end
|
129
|
+
|
130
|
+
def render_bind_v4_2(column, value)
|
131
|
+
if column
|
132
|
+
if column.binary?
|
133
|
+
# This specifically deals with the PG adapter that casts bytea columns into a Hash.
|
134
|
+
value = value[:value] if value.is_a?(Hash)
|
135
|
+
value = value ? "<#{value.bytesize} bytes of binary data>" : "<NULL binary data>"
|
136
|
+
end
|
137
|
+
|
138
|
+
[column.name, value]
|
139
|
+
else
|
140
|
+
[nil, value]
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def render_bind_v5_0_0(attribute)
|
145
|
+
value =
|
146
|
+
if attribute.type.binary? && attribute.value
|
147
|
+
if attribute.value.is_a?(Hash)
|
148
|
+
"<#{attribute.value_for_database.to_s.bytesize} bytes of binary data>"
|
149
|
+
else
|
150
|
+
"<#{attribute.value.bytesize} bytes of binary data>"
|
151
|
+
end
|
152
|
+
else
|
153
|
+
attribute.value_for_database
|
154
|
+
end
|
155
|
+
|
156
|
+
[attribute.name, value]
|
157
|
+
end
|
158
|
+
|
159
|
+
def render_bind_v5_0_3(attr, value)
|
160
|
+
if attr.is_a?(Array)
|
161
|
+
attr = attr.first
|
162
|
+
elsif attr.type.binary? && attr.value
|
163
|
+
value = "<#{attr.value_for_database.to_s.bytesize} bytes of binary data>"
|
164
|
+
end
|
165
|
+
|
166
|
+
[attr&.name, value]
|
167
|
+
end
|
168
|
+
|
169
|
+
def render_bind_v6_1(attr, value)
|
170
|
+
case attr
|
171
|
+
when ActiveModel::Attribute
|
172
|
+
if attr.type.binary? && attr.value
|
173
|
+
value = "<#{attr.value_for_database.to_s.bytesize} bytes of binary data>"
|
174
|
+
end
|
175
|
+
when Array
|
176
|
+
attr = attr.first
|
177
|
+
else
|
178
|
+
attr = nil
|
179
|
+
end
|
180
|
+
|
181
|
+
[attr&.name || :nil, value]
|
182
|
+
end
|
183
|
+
|
184
|
+
def type_casted_binds_v5_0_3(binds, casted_binds)
|
185
|
+
casted_binds || ::ActiveRecord::Base.connection.type_casted_binds(binds)
|
186
|
+
end
|
187
|
+
|
188
|
+
def type_casted_binds_v5_1_5(casted_binds)
|
189
|
+
casted_binds.respond_to?(:call) ? casted_binds.call : casted_binds
|
190
|
+
end
|
191
|
+
|
192
|
+
if Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR.zero? && Rails::VERSION::TINY <= 2 # 5.0.0 - 5.0.2
|
193
|
+
alias bind_values bind_values_v5_0_0
|
194
|
+
alias render_bind render_bind_v5_0_0
|
195
|
+
elsif Rails::VERSION::MAJOR == 5 &&
|
196
|
+
((Rails::VERSION::MINOR.zero? && Rails::VERSION::TINY <= 6) ||
|
197
|
+
(Rails::VERSION::MINOR == 1 && Rails::VERSION::TINY <= 4)) # 5.0.3 - 5.0.6 && 5.1.0 - 5.1.4
|
198
|
+
alias bind_values bind_values_v5_0_3
|
199
|
+
alias render_bind render_bind_v5_0_3
|
200
|
+
alias type_casted_binds type_casted_binds_v5_0_3
|
201
|
+
elsif (Rails::VERSION::MAJOR == 6 && Rails::VERSION::MINOR > 0) || # ~> 6.1.0
|
202
|
+
Rails::VERSION::MAJOR == 7
|
203
|
+
alias bind_values bind_values_v6_1
|
204
|
+
alias render_bind render_bind_v6_1
|
205
|
+
alias type_casted_binds type_casted_binds_v5_1_5
|
206
|
+
elsif Rails::VERSION::MAJOR >= 5 # ~> 5.1.5 && ~> 5.0.7 && 6.x.x
|
207
|
+
alias bind_values bind_values_v5_1_5
|
208
|
+
alias render_bind render_bind_v5_0_3
|
209
|
+
alias type_casted_binds type_casted_binds_v5_1_5
|
210
|
+
elsif Rails.version.to_i >= 4 # 4.x
|
211
|
+
alias bind_values bind_values_v4
|
212
|
+
alias render_bind render_bind_v4_2
|
213
|
+
else # 3.x
|
214
|
+
alias bind_values bind_values_v3
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require "rails"
|
2
|
+
require "rails_semantic_logger/options"
|
3
|
+
|
1
4
|
module RailsSemanticLogger
|
2
5
|
class Engine < ::Rails::Engine
|
3
6
|
# Make the SemanticLogger config available in the Rails application config
|
@@ -16,92 +19,7 @@ module RailsSemanticLogger
|
|
16
19
|
# end
|
17
20
|
config.semantic_logger = ::SemanticLogger
|
18
21
|
|
19
|
-
config.rails_semantic_logger
|
20
|
-
|
21
|
-
# Convert Action Controller and Active Record text messages to semantic data
|
22
|
-
# Rails -- Started -- { :ip => "127.0.0.1", :method => "GET", :path => "/dashboards/inquiry_recent_activity" }
|
23
|
-
# UserController -- Completed #index -- { :action => "index", :db_runtime => 54.64, :format => "HTML", :method => "GET", :mongo_runtime => 0.0, :path => "/users", :status => 200, :status_message => "OK", :view_runtime => 709.88 }
|
24
|
-
config.rails_semantic_logger.semantic = true
|
25
|
-
|
26
|
-
# Change Rack started message to debug so that it does not appear in production
|
27
|
-
config.rails_semantic_logger.started = false
|
28
|
-
|
29
|
-
# Change Processing message to debug so that it does not appear in production
|
30
|
-
config.rails_semantic_logger.processing = false
|
31
|
-
|
32
|
-
# Change Action View render log messages to debug so that they do not appear in production
|
33
|
-
# ActionView::Base -- Rendered data/search/_user.html.haml (46.7ms)
|
34
|
-
config.rails_semantic_logger.rendered = false
|
35
|
-
|
36
|
-
# Override the Awesome Print options for logging Hash data as text:
|
37
|
-
#
|
38
|
-
# Any valid AwesomePrint option for rendering data.
|
39
|
-
# The defaults can changed be creating a `~/.aprc` file.
|
40
|
-
# See: https://github.com/michaeldv/awesome_print
|
41
|
-
#
|
42
|
-
# Note: The option :multiline is set to false if not supplied.
|
43
|
-
# Note: Has no effect if Awesome Print is not installed.
|
44
|
-
config.rails_semantic_logger.ap_options = {multiline: false}
|
45
|
-
|
46
|
-
# Whether to automatically add an environment specific log file appender.
|
47
|
-
# For Example: 'log/development.log'
|
48
|
-
#
|
49
|
-
# Note:
|
50
|
-
# When Semantic Logger fails to log to an appender it logs the error to an
|
51
|
-
# internal logger, which by default writes to STDERR.
|
52
|
-
# Example, change the default internal logger to log to stdout:
|
53
|
-
# SemanticLogger::Processor.logger = SemanticLogger::Appender::File.new(io: STDOUT, level: :warn)
|
54
|
-
config.rails_semantic_logger.add_file_appender = true
|
55
|
-
|
56
|
-
# Silence asset logging
|
57
|
-
config.rails_semantic_logger.quiet_assets = false
|
58
|
-
|
59
|
-
# Override the output format for the primary Rails log file.
|
60
|
-
#
|
61
|
-
# Valid options:
|
62
|
-
# * :default
|
63
|
-
# Plain text output with no color.
|
64
|
-
# * :color
|
65
|
-
# Plain text output with color.
|
66
|
-
# * :json
|
67
|
-
# JSON output format.
|
68
|
-
# * class
|
69
|
-
#
|
70
|
-
# * Proc
|
71
|
-
# A block that will be called to format the output.
|
72
|
-
# It is supplied with the `log` entry and should return the formatted data.
|
73
|
-
#
|
74
|
-
# Note:
|
75
|
-
# * `:default` is automatically changed to `:color` if `config.colorize_logging` is `true`.
|
76
|
-
#
|
77
|
-
# JSON Example, in `application.rb`:
|
78
|
-
#
|
79
|
-
# config.rails_semantic_logger.format = :json
|
80
|
-
#
|
81
|
-
# Custom Example, create `app/lib/my_formatter.rb`:
|
82
|
-
#
|
83
|
-
# # My Custom colorized formatter
|
84
|
-
# class MyFormatter < SemanticLogger::Formatters::Color
|
85
|
-
# # Return the complete log level name in uppercase
|
86
|
-
# def level
|
87
|
-
# "#{color}log.level.upcase#{color_map.clear}"
|
88
|
-
# end
|
89
|
-
# end
|
90
|
-
#
|
91
|
-
# # In application.rb:
|
92
|
-
# config.rails_semantic_logger.format = MyFormatter.new
|
93
|
-
config.rails_semantic_logger.format = :default
|
94
|
-
|
95
|
-
# DEPRECATED
|
96
|
-
# Instead, supply a Hash to config.log_tags
|
97
|
-
config.rails_semantic_logger.named_tags = nil
|
98
|
-
|
99
|
-
# Add a filter to the file logger [Regexp|Proc]
|
100
|
-
# RegExp: Only include log messages where the class name matches the supplied
|
101
|
-
# regular expression. All other messages will be ignored.
|
102
|
-
# Proc: Only include log messages where the supplied Proc returns true.
|
103
|
-
# The Proc must return true or false.
|
104
|
-
config.rails_semantic_logger.filter = nil
|
22
|
+
config.rails_semantic_logger = RailsSemanticLogger::Options.new
|
105
23
|
|
106
24
|
# Initialize SemanticLogger. In a Rails environment it will automatically
|
107
25
|
# insert itself above the configured rails logger to add support for its
|
@@ -111,153 +29,230 @@ module RailsSemanticLogger
|
|
111
29
|
Rails::Application::Bootstrap.initializers.delete_if { |i| i.name == :initialize_logger }
|
112
30
|
|
113
31
|
initializer :initialize_logger, group: :all do
|
114
|
-
config
|
32
|
+
config = Rails.application.config
|
115
33
|
|
116
34
|
# Set the default log level based on the Rails config
|
117
35
|
SemanticLogger.default_level = config.log_level
|
118
36
|
|
37
|
+
if defined?(Rails::Rack::Logger) && config.rails_semantic_logger.semantic
|
38
|
+
config.middleware.swap(Rails::Rack::Logger, RailsSemanticLogger::Rack::Logger, config.log_tags)
|
39
|
+
end
|
40
|
+
|
119
41
|
# Existing loggers are ignored because servers like trinidad supply their
|
120
42
|
# own file loggers which would result in duplicate logging to the same log file
|
121
|
-
Rails.logger
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
SemanticLogger.appenders.each
|
140
|
-
|
141
|
-
|
43
|
+
Rails.logger = config.logger =
|
44
|
+
begin
|
45
|
+
if config.rails_semantic_logger.add_file_appender
|
46
|
+
path = config.paths["log"].first
|
47
|
+
FileUtils.mkdir_p(File.dirname(path)) unless File.exist?(File.dirname(path))
|
48
|
+
|
49
|
+
# Add the log file to the list of appenders
|
50
|
+
# Use the colorized formatter if Rails colorized logs are enabled
|
51
|
+
ap_options = config.rails_semantic_logger.ap_options
|
52
|
+
formatter = config.rails_semantic_logger.format
|
53
|
+
formatter = {color: {ap: ap_options}} if (formatter == :default) && (config.colorize_logging != false)
|
54
|
+
|
55
|
+
# Set internal logger to log to file only, in case another appender experiences errors during writes
|
56
|
+
appender = SemanticLogger::Appender::File.new(path, formatter: formatter)
|
57
|
+
appender.name = "SemanticLogger"
|
58
|
+
SemanticLogger::Processor.logger = appender
|
59
|
+
|
60
|
+
# Check for previous file or stdout loggers
|
61
|
+
SemanticLogger.appenders.each do |app|
|
62
|
+
next unless app.is_a?(SemanticLogger::Appender::File) || app.is_a?(SemanticLogger::Appender::IO)
|
63
|
+
|
64
|
+
app.formatter = formatter
|
65
|
+
end
|
66
|
+
SemanticLogger.add_appender(file_name: path, formatter: formatter, filter: config.rails_semantic_logger.filter)
|
142
67
|
end
|
143
|
-
SemanticLogger.add_appender(file_name: path, formatter: formatter, filter: config.rails_semantic_logger.filter)
|
144
|
-
end
|
145
68
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
69
|
+
SemanticLogger[Rails]
|
70
|
+
rescue StandardError => e
|
71
|
+
# If not able to log to file, log to standard error with warning level only
|
72
|
+
SemanticLogger.default_level = :warn
|
73
|
+
|
74
|
+
SemanticLogger::Processor.logger = SemanticLogger::Appender::IO.new($stderr)
|
75
|
+
SemanticLogger.add_appender(io: $stderr)
|
76
|
+
|
77
|
+
logger = SemanticLogger[Rails]
|
78
|
+
logger.warn(
|
79
|
+
"Rails Error: Unable to access log file. Please ensure that #{path} exists and is chmod 0666. " \
|
80
|
+
"The log level has been raised to WARN and the output directed to STDERR until the problem is fixed.",
|
81
|
+
e
|
82
|
+
)
|
83
|
+
logger
|
84
|
+
end
|
162
85
|
|
163
86
|
# Replace Rails loggers
|
164
|
-
[
|
87
|
+
%i[active_record action_controller action_mailer action_view].each do |name|
|
165
88
|
ActiveSupport.on_load(name) { include SemanticLogger::Loggable }
|
166
89
|
end
|
167
|
-
ActiveSupport.on_load(:action_cable) { self.logger = SemanticLogger[
|
90
|
+
ActiveSupport.on_load(:action_cable) { self.logger = SemanticLogger["ActionCable"] }
|
168
91
|
end
|
169
92
|
|
170
|
-
#
|
171
|
-
config.
|
172
|
-
|
173
|
-
|
174
|
-
assets_regex = %r(\A/{0,2}#{config.assets.prefix})
|
175
|
-
if Rails.version.to_i >= 5
|
176
|
-
Rails::Rack::Logger.logger.filter = -> log { log.payload[:path] !~ assets_regex if log.payload }
|
177
|
-
else
|
178
|
-
# Also strips the empty log lines
|
179
|
-
Rails::Rack::Logger.logger.filter = -> log { log.payload.nil? ? (log.message != '') : (log.payload[:path] !~ assets_regex) }
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
# Passenger provides the :starting_worker_process event for executing
|
184
|
-
# code after it has forked, so we use that and reconnect immediately.
|
185
|
-
if defined?(PhusionPassenger)
|
186
|
-
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
187
|
-
::SemanticLogger.reopen if forked
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
# Re-open appenders after Resque has forked a worker
|
192
|
-
if defined?(Resque)
|
193
|
-
Resque.after_fork { |job| ::SemanticLogger.reopen }
|
194
|
-
end
|
93
|
+
# Before any initializers run, but after the gems have been loaded
|
94
|
+
config.before_initialize do
|
95
|
+
if config.respond_to?(:assets) && defined?(Rails::Rack::Logger) && config.rails_semantic_logger.semantic
|
96
|
+
config.rails_semantic_logger.quiet_assets = true if config.assets.quiet
|
195
97
|
|
196
|
-
|
197
|
-
|
198
|
-
Spring.after_fork { |job| ::SemanticLogger.reopen }
|
98
|
+
# Otherwise Sprockets can't find the Rails::Rack::Logger middleware
|
99
|
+
config.assets.quiet = false
|
199
100
|
end
|
200
|
-
end
|
201
101
|
|
202
|
-
# Before any initializers run, but after the gems have been loaded
|
203
|
-
config.before_initialize do
|
204
102
|
# Replace the Mongo Loggers
|
205
|
-
Mongoid.logger
|
206
|
-
Moped.logger
|
207
|
-
Mongo::Logger.logger
|
103
|
+
Mongoid.logger = SemanticLogger[Mongoid] if defined?(Mongoid)
|
104
|
+
Moped.logger = SemanticLogger[Moped] if defined?(Moped)
|
105
|
+
Mongo::Logger.logger = SemanticLogger[Mongo] if defined?(Mongo::Logger)
|
208
106
|
|
209
107
|
# Replace the Resque Logger
|
210
|
-
Resque.logger
|
108
|
+
Resque.logger = SemanticLogger[Resque] if defined?(Resque) && Resque.respond_to?(:logger=)
|
211
109
|
|
212
110
|
# Replace the Sidekiq logger
|
213
|
-
|
111
|
+
if defined?(Sidekiq)
|
112
|
+
if Sidekiq.respond_to?(:logger=)
|
113
|
+
Sidekiq.logger = SemanticLogger[Sidekiq]
|
114
|
+
elsif Sidekiq::VERSION[0..1] == '7.'
|
115
|
+
method = Sidekiq.server? ? :configure_server : :configure_client
|
116
|
+
Sidekiq.public_send(method) { |cfg| cfg.logger = SemanticLogger[Sidekiq] }
|
117
|
+
end
|
118
|
+
end
|
214
119
|
|
215
120
|
# Replace the Sidetiq logger
|
216
|
-
Sidetiq.logger
|
121
|
+
Sidetiq.logger = SemanticLogger[Sidetiq] if defined?(Sidetiq) && Sidetiq.respond_to?(:logger=)
|
122
|
+
|
123
|
+
# Replace the DelayedJob logger
|
124
|
+
if defined?(Delayed::Worker)
|
125
|
+
Delayed::Worker.logger = SemanticLogger[Delayed::Worker]
|
126
|
+
Delayed::Worker.plugins << RailsSemanticLogger::DelayedJob::Plugin
|
127
|
+
end
|
217
128
|
|
218
129
|
# Replace the Bugsnag logger
|
219
130
|
Bugsnag.configure { |config| config.logger = SemanticLogger[Bugsnag] } if defined?(Bugsnag)
|
220
131
|
|
221
|
-
# Set the
|
222
|
-
|
132
|
+
# Set the IOStreams PGP logger
|
133
|
+
IOStreams::Pgp.logger = SemanticLogger["IOStreams::Pgp"] if defined?(IOStreams)
|
134
|
+
end
|
135
|
+
|
136
|
+
# After any initializers run, but after the gems have been loaded
|
137
|
+
config.after_initialize do
|
138
|
+
config = Rails.application.config
|
139
|
+
|
140
|
+
# Replace the Bugsnag logger
|
141
|
+
Bugsnag.configure { |bugsnag_config| bugsnag_config.logger = SemanticLogger[Bugsnag] } if defined?(Bugsnag)
|
223
142
|
|
224
143
|
# Rails Patches
|
225
|
-
require(
|
226
|
-
require(
|
227
|
-
require(
|
228
|
-
|
229
|
-
|
230
|
-
|
144
|
+
require("rails_semantic_logger/extensions/action_cable/tagged_logger_proxy") if defined?(::ActionCable)
|
145
|
+
require("rails_semantic_logger/extensions/action_controller/live") if defined?(::ActionController::Live)
|
146
|
+
require("rails_semantic_logger/extensions/action_dispatch/debug_exceptions") if defined?(::ActionDispatch::DebugExceptions)
|
147
|
+
if defined?(::ActionView::StreamingTemplateRenderer::Body)
|
148
|
+
require("rails_semantic_logger/extensions/action_view/streaming_template_renderer")
|
149
|
+
end
|
150
|
+
require("rails_semantic_logger/extensions/active_job/logging") if defined?(::ActiveJob)
|
151
|
+
require("rails_semantic_logger/extensions/active_model_serializers/logging") if defined?(::ActiveModelSerializers)
|
231
152
|
|
232
153
|
if config.rails_semantic_logger.semantic
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
154
|
+
# Active Job
|
155
|
+
if defined?(::ActiveJob) && defined?(::ActiveJob::Logging::LogSubscriber)
|
156
|
+
RailsSemanticLogger.swap_subscriber(
|
157
|
+
::ActiveJob::Logging::LogSubscriber,
|
158
|
+
RailsSemanticLogger::ActiveJob::LogSubscriber,
|
159
|
+
:active_job
|
160
|
+
)
|
161
|
+
end
|
237
162
|
|
238
|
-
|
239
|
-
|
240
|
-
|
163
|
+
if defined?(::ActiveJob) && defined?(::ActiveJob::LogSubscriber)
|
164
|
+
RailsSemanticLogger.swap_subscriber(
|
165
|
+
::ActiveJob::LogSubscriber,
|
166
|
+
RailsSemanticLogger::ActiveJob::LogSubscriber,
|
167
|
+
:active_job
|
168
|
+
)
|
169
|
+
end
|
241
170
|
|
242
|
-
|
243
|
-
|
244
|
-
|
171
|
+
# Active Record
|
172
|
+
if defined?(::ActiveRecord)
|
173
|
+
require "active_record/log_subscriber"
|
174
|
+
|
175
|
+
RailsSemanticLogger.swap_subscriber(
|
176
|
+
::ActiveRecord::LogSubscriber,
|
177
|
+
RailsSemanticLogger::ActiveRecord::LogSubscriber,
|
178
|
+
:active_record
|
179
|
+
)
|
180
|
+
end
|
181
|
+
|
182
|
+
# Rack
|
183
|
+
RailsSemanticLogger::Rack::Logger.started_request_log_level = :info if config.rails_semantic_logger.started
|
184
|
+
|
185
|
+
# Silence asset logging by applying a filter to the Rails logger itself, not any of the appenders.
|
186
|
+
if config.rails_semantic_logger.quiet_assets && config.assets.prefix
|
187
|
+
assets_root = config.relative_url_root.to_s + config.assets.prefix
|
188
|
+
assets_regex = %r(\A/{0,2}#{assets_root})
|
189
|
+
RailsSemanticLogger::Rack::Logger.logger.filter = ->(log) { log.payload[:path] !~ assets_regex if log.payload }
|
190
|
+
end
|
191
|
+
|
192
|
+
# Action View
|
193
|
+
if defined?(::ActionView)
|
194
|
+
require "action_view/log_subscriber"
|
195
|
+
|
196
|
+
RailsSemanticLogger::ActionView::LogSubscriber.rendered_log_level = :info if config.rails_semantic_logger.rendered
|
197
|
+
RailsSemanticLogger.swap_subscriber(
|
198
|
+
::ActionView::LogSubscriber,
|
199
|
+
RailsSemanticLogger::ActionView::LogSubscriber,
|
200
|
+
:action_view
|
201
|
+
)
|
202
|
+
end
|
245
203
|
|
246
|
-
|
247
|
-
|
204
|
+
# Action Controller
|
205
|
+
if defined?(::ActionController)
|
206
|
+
require "action_controller/log_subscriber"
|
207
|
+
|
208
|
+
RailsSemanticLogger.swap_subscriber(
|
209
|
+
::ActionController::LogSubscriber,
|
210
|
+
RailsSemanticLogger::ActionController::LogSubscriber,
|
211
|
+
:action_controller
|
212
|
+
)
|
213
|
+
end
|
214
|
+
|
215
|
+
# Action Mailer
|
216
|
+
if defined?(::ActionMailer)
|
217
|
+
require "action_mailer/log_subscriber"
|
218
|
+
|
219
|
+
RailsSemanticLogger.swap_subscriber(
|
220
|
+
::ActionMailer::LogSubscriber,
|
221
|
+
RailsSemanticLogger::ActionMailer::LogSubscriber,
|
222
|
+
:action_mailer
|
223
|
+
)
|
224
|
+
end
|
248
225
|
end
|
249
226
|
|
250
|
-
#
|
251
|
-
|
252
|
-
|
227
|
+
#
|
228
|
+
# Forking Frameworks
|
229
|
+
#
|
230
|
+
|
231
|
+
# Passenger provides the :starting_worker_process event for executing
|
232
|
+
# code after it has forked, so we use that and reconnect immediately.
|
233
|
+
if defined?(PhusionPassenger)
|
234
|
+
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
235
|
+
SemanticLogger.reopen if forked
|
236
|
+
end
|
253
237
|
end
|
254
|
-
end
|
255
238
|
|
256
|
-
|
257
|
-
|
258
|
-
# Replace the Bugsnag logger
|
259
|
-
Bugsnag.configure { |config| config.logger = SemanticLogger[Bugsnag] } if defined?(Bugsnag)
|
260
|
-
end
|
239
|
+
# Re-open appenders after Resque has forked a worker
|
240
|
+
Resque.after_fork { |_job| ::SemanticLogger.reopen } if defined?(Resque)
|
261
241
|
|
242
|
+
# Re-open appenders after Spring has forked a process
|
243
|
+
Spring.after_fork { |_job| ::SemanticLogger.reopen } if defined?(Spring.after_fork)
|
244
|
+
|
245
|
+
console do |_app|
|
246
|
+
# Don't use a background thread for logging
|
247
|
+
SemanticLogger.sync!
|
248
|
+
# Add a stderr logger when running inside a Rails console unless one has already been added.
|
249
|
+
if config.rails_semantic_logger.console_logger && !SemanticLogger.appenders.console_output?
|
250
|
+
SemanticLogger.add_appender(io: STDERR, formatter: :color)
|
251
|
+
end
|
252
|
+
|
253
|
+
# Include method names on log entries in the console
|
254
|
+
SemanticLogger.backtrace_level = SemanticLogger.default_level
|
255
|
+
end
|
256
|
+
end
|
262
257
|
end
|
263
258
|
end
|