rails_semantic_logger 3.0.1 → 3.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d08b2b972eaf1186c52d9843aef02585f0f41b2c
4
- data.tar.gz: 8dac75b9cbbc7f03bd7c90d25e293b3132810de3
3
+ metadata.gz: 6b67e5d8f28b2e51e0718ba6bb78836efffba19b
4
+ data.tar.gz: 8f255e0c6a0d030f40e45423db46187aae7fcd9f
5
5
  SHA512:
6
- metadata.gz: 2d877c06b9d76c0b404e4c269e43b3d6e67d06c7d6e2e95f74b8d8676a94e944167d605403097886170a0c4e9d9ab841e58866ec42cd47d40afa5926190ccdbd
7
- data.tar.gz: 30442065d1a273fde0a7166bb06b3074ac32ca7411441c8046a52386fa679bd194b28e30960651b12dbb79a11881ea8a66256ff8d776e225c0bf04f6f8340381
6
+ metadata.gz: b5202dc5e4bfcd755dfd1de312e3023ac4526d933094df2ded3495420fac0882df959f5a6a2be29054c3bb1d91cc1adb5eb81152a75766105e586caf082c597a
7
+ data.tar.gz: 9cf9187d55b5bb2a862be2c58e36aecec7cf318f91ca1f64287b9690c834e13ec503cbf22e943eabd49d70cc5f93e9dc38765c139b9dd5ef4bb89165f6cc5a7e
data/README.md CHANGED
@@ -14,7 +14,7 @@ For complete documentation see: http://rocketjob.github.io/semantic_logger/rails
14
14
  ## Supports
15
15
 
16
16
  - Ruby 1.9.3, 2.0, 2.1, 2.2 (or above) Or, JRuby 1.7, 9.0 (or above)
17
- - Rails 3, 4, 5 (or above)
17
+ - Rails 3.2, 4, 5 (or above)
18
18
 
19
19
  ## Author
20
20
 
@@ -0,0 +1,12 @@
1
+ ActionCable::Connection::TaggedLoggerProxy
2
+
3
+ module ActionCable
4
+ module Connection
5
+ class TaggedLoggerProxy
6
+ def tag(logger, &block)
7
+ current_tags = tags - logger.tags
8
+ logger.tagged(*current_tags, &block)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ # Log actual exceptions, not a string representation
2
+ ActionController::Live
3
+ module ActionController::Live
4
+ def log_error(exception)
5
+ logger.fatal(exception)
6
+ end
7
+ end
@@ -0,0 +1,101 @@
1
+ ActionController::LogSubscriber
2
+
3
+ module ActionController
4
+ class LogSubscriber
5
+ # Log as debug to hide Processing messages in production
6
+ def start_processing(event)
7
+ controller_logger(event).debug { "Processing ##{event.payload[:action]}" }
8
+ end
9
+
10
+ def process_action(event)
11
+ controller_logger(event).info do
12
+ payload = event.payload
13
+ params = payload[:params].except(*INTERNAL_PARAMS)
14
+ format = payload[:format]
15
+ format = format.to_s.upcase if format.is_a?(Symbol)
16
+ status = payload[:status]
17
+
18
+ if status.nil? && payload[:exception].present?
19
+ exception_class_name = payload[:exception].first
20
+ status = ActionDispatch::ExceptionWrapper.status_code_for_exception(exception_class_name)
21
+ end
22
+
23
+ log = {
24
+ message: "Completed ##{payload[:action]}",
25
+ status: status,
26
+ status_message: Rack::Utils::HTTP_STATUS_CODES[status],
27
+ format: format,
28
+ path: payload[:path],
29
+ action: payload[:action],
30
+ method: payload[:method],
31
+ duration: event.duration
32
+ }
33
+ collect_runtimes(payload, log)
34
+ log[:params] = params unless params.empty?
35
+ log
36
+ end
37
+ end
38
+
39
+ def halted_callback(event)
40
+ controller_logger(event).info { "Filter chain halted as #{event.payload[:filter].inspect} rendered or redirected" }
41
+ end
42
+
43
+ def send_file(event)
44
+ controller_logger(event).info('Sent file') { {path: event.payload[:path], duration: event.duration} }
45
+ end
46
+
47
+ def redirect_to(event)
48
+ controller_logger(event).info('Redirected to') { {location: event.payload[:location]} }
49
+ end
50
+
51
+ def send_data(event)
52
+ controller_logger(event).info('Sent data') { {file_name: event.payload[:filename], duration: event.duration} }
53
+ end
54
+
55
+ def unpermitted_parameters(event)
56
+ controller_logger(event).debug do
57
+ unpermitted_keys = event.payload[:keys]
58
+ "Unpermitted parameter#{'s' if unpermitted_keys.size > 1}: #{unpermitted_keys.join(", ")}"
59
+ end
60
+ end
61
+
62
+ %w(write_fragment read_fragment exist_fragment?
63
+ expire_fragment expire_page write_page).each do |method|
64
+ class_eval <<-METHOD, __FILE__, __LINE__ + 1
65
+ def #{method}(event)
66
+ controller_logger(event).info do
67
+ key_or_path = event.payload[:key] || event.payload[:path]
68
+ {message: "#{method.to_s.humanize} \#{key_or_path}", duration: event.duration}
69
+ end
70
+ end
71
+ METHOD
72
+ end
73
+
74
+ private
75
+
76
+ # Returns the logger for the supplied event.
77
+ # Returns ActionController::Base.logger if no controller is present
78
+ def controller_logger(event)
79
+ if controller = event.payload[:controller]
80
+ begin
81
+ controller.constantize.logger
82
+ rescue NameError
83
+ ActionController::Base.logger
84
+ end
85
+ else
86
+ ActionController::Base.logger
87
+ end
88
+ end
89
+
90
+ # Returns [Hash] runtimes for all registered runtime collection subscribers
91
+ # For example, :view_runtime, :mongo_runtime, etc.
92
+ def collect_runtimes(payload, log)
93
+ payload.each_pair do |key, value|
94
+ if match = key.to_s.match(/(.*)_runtime/)
95
+ log[key] = value.to_f.round(2)
96
+ end
97
+ end
98
+ end
99
+
100
+ end
101
+ end
@@ -0,0 +1,27 @@
1
+ ActionController::LogSubscriber
2
+
3
+ module ActionController
4
+ class LogSubscriber
5
+ # Log as info to show Processing messages in production
6
+ def start_processing(event)
7
+ controller_logger(event).info { "Processing ##{event.payload[:action]}" }
8
+ end
9
+
10
+ private
11
+
12
+ # Returns the logger for the supplied event.
13
+ # Returns ActionController::Base.logger if no controller is present
14
+ def controller_logger(event)
15
+ if controller = event.payload[:controller]
16
+ begin
17
+ controller.constantize.logger
18
+ rescue NameError
19
+ ActionController::Base.logger
20
+ end
21
+ else
22
+ ActionController::Base.logger
23
+ end
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ # Log actual exceptions, not a string representation
2
+ ActionDispatch::DebugExceptions
3
+ class ActionDispatch::DebugExceptions
4
+ private
5
+ def log_error(request, wrapper)
6
+ ActiveSupport::Deprecation.silence do
7
+ ActionController::Base.logger.fatal(wrapper.exception)
8
+ end
9
+ end
10
+ end
11
+
@@ -0,0 +1,12 @@
1
+ ActionView::LogSubscriber
2
+ module ActionView
3
+ class LogSubscriber
4
+ def info(message = nil, &block)
5
+ debug(message, &block)
6
+ end
7
+
8
+ def info?
9
+ debug?
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ # Log actual exceptions, not a string representation
2
+ ActionView::StreamingTemplateRenderer
3
+
4
+ class ActionView::StreamingTemplateRenderer
5
+ class Body
6
+ private
7
+ def log_error(exception) #:nodoc:
8
+ ActionView::Base.logger.fatal(exception)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ # Patch ActiveJob logger
2
+ ActiveJob::Logging
3
+
4
+ module ActiveJob::Logging
5
+ private
6
+ def tag_logger(*tags, &block)
7
+ logger.tagged(*tags, &block)
8
+ end
9
+ end
@@ -0,0 +1,37 @@
1
+ ActiveRecord::LogSubscriber
2
+ module ActiveRecord
3
+ class LogSubscriber
4
+ def sql(event)
5
+ self.class.runtime += event.duration
6
+
7
+ return unless logger.debug?
8
+
9
+ payload = event.payload
10
+ name = payload[:name]
11
+ return if IGNORE_PAYLOAD_NAMES.include?(name)
12
+
13
+ log = {
14
+ message: name,
15
+ sql: payload[:sql],
16
+ duration: event.duration
17
+ }
18
+ unless (payload[:binds] || []).empty?
19
+ log[:binds] = binds = {}
20
+ # Changed with Rails 5
21
+ if Rails.version.to_i >= 5
22
+ payload[:binds].each do |attr|
23
+ attr_name, value = render_bind(attr)
24
+ binds[attr_name] = value
25
+ end
26
+ else
27
+ payload[:binds].each do |col, v|
28
+ attr_name, value = render_bind(col, v)
29
+ binds[attr_name] = value
30
+ end
31
+ end
32
+ end
33
+ debug(log)
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,19 @@
1
+ Rails::Rack::Logger
2
+
3
+ # Replace rack started message with a semantic equivalent
4
+ module Rails
5
+ module Rack
6
+ class Logger
7
+ def started_request_message(request)
8
+ {
9
+ message: 'Started',
10
+ method: request.request_method,
11
+ path: request.filtered_path,
12
+ ip: request.ip
13
+ }
14
+ end
15
+
16
+ end
17
+ end
18
+ end
19
+
@@ -0,0 +1,28 @@
1
+ Rails::Rack::Logger
2
+
3
+ # Drop rack Started message to debug level message
4
+ module Rails
5
+ module Rack
6
+ class Logger
7
+ private
8
+
9
+ module LogInfoAsDebug
10
+ def info(*args, &block)
11
+ debug(*args, &block)
12
+ end
13
+ def info?
14
+ debug?
15
+ end
16
+ end
17
+
18
+ def logger
19
+ @logger ||= begin
20
+ logger = SemanticLogger['Rails']
21
+ logger.extend(LogInfoAsDebug)
22
+ logger
23
+ end
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ # Patch the Rails::Server log_to_stdout so that it logs via SemanticLogger
2
+ Rails::Server
3
+ module Rails #:nodoc:
4
+ class Server #:nodoc:
5
+ private
6
+
7
+ def log_to_stdout
8
+ SemanticLogger.add_appender(io: $stdout, formatter: :color)
9
+ end
10
+ end
11
+ end
@@ -1,5 +1,6 @@
1
- require 'logger'
2
- require 'rails/commands/server'
1
+ require('rails_semantic_logger/extensions/rails/server') if defined?(Rails::Server)
2
+
3
+ # Replace standard Rails logger
3
4
  module RailsSemanticLogger #:nodoc:
4
5
  class Railtie < Rails::Railtie #:nodoc:
5
6
  # Make the SemanticLogger config available in the Rails application config
@@ -10,13 +11,41 @@ module RailsSemanticLogger #:nodoc:
10
11
  # Rails::Application.configure do
11
12
  # # Add the MongoDB logger appender only once Rails is initialized
12
13
  # config.after_initialize do
13
- # config.semantic_logger.add_appender SemanticLogger::Appender::Mongo.new(
14
- # :db => Mongo::Connection.new['development_development']
15
- # )
14
+ # appender = SemanticLogger::Appender::Mongo.new(
15
+ # db: Mongo::Connection.new['myapp_development']
16
+ # )
17
+ # config.semantic_logger.add_appender(appender: appender)
16
18
  # end
17
19
  # end
18
20
  config.semantic_logger = ::SemanticLogger
19
21
 
22
+ config.rails_semantic_logger = ActiveSupport::OrderedOptions.new
23
+
24
+ # Convert Action Controller and Active Record text messages to semantic data
25
+ # Rails -- Started -- { :ip => "127.0.0.1", :method => "GET", :path => "/dashboards/inquiry_recent_activity" }
26
+ # 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 }
27
+ config.rails_semantic_logger.semantic = true
28
+
29
+ # Change Rack started message to debug so that it does not appear in production
30
+ config.rails_semantic_logger.started = false
31
+
32
+ # Change Processing message to debug so that it does not appear in production
33
+ config.rails_semantic_logger.processing = false
34
+
35
+ # Change Action View render log messages to debug so that they do not appear in production
36
+ # ActionView::Base -- Rendered data/search/_user.html.haml (46.7ms)
37
+ config.rails_semantic_logger.rendered = false
38
+
39
+ # Override the Awesome Print options for logging Hash data as text:
40
+ #
41
+ # Any valid AwesomePrint option for rendering data.
42
+ # The defaults can changed be creating a `~/.aprc` file.
43
+ # See: https://github.com/michaeldv/awesome_print
44
+ #
45
+ # Note: The option :multiline is set to false if not supplied.
46
+ # Note: Has no effect if Awesome Print is not installed.
47
+ config.rails_semantic_logger.ap_options = {multiline: false}
48
+
20
49
  # Initialize SemanticLogger. In a Rails environment it will automatically
21
50
  # insert itself above the configured rails logger to add support for its
22
51
  # additional features
@@ -33,11 +62,8 @@ module RailsSemanticLogger #:nodoc:
33
62
  # Existing loggers are ignored because servers like trinidad supply their
34
63
  # own file loggers which would result in duplicate logging to the same log file
35
64
  Rails.logger = config.logger = begin
36
- # First check for Rails 3.2 path, then fallback to pre-3.2
37
- path = ((config.paths.log.to_a rescue nil) || config.paths['log']).first
38
- unless File.exist? File.dirname path
39
- FileUtils.mkdir_p File.dirname path
40
- end
65
+ path = config.paths['log'].first
66
+ FileUtils.mkdir_p(File.dirname(path)) unless File.exist?(File.dirname(path))
41
67
 
42
68
  # Set internal logger to log to file only, in case another appender
43
69
  # experiences errors during writes
@@ -47,15 +73,18 @@ module RailsSemanticLogger #:nodoc:
47
73
 
48
74
  # Add the log file to the list of appenders
49
75
  # Use the colorized formatter if Rails colorized logs are enabled
50
- formatter = SemanticLogger::Appender::Base.colorized_formatter unless config.colorize_logging == false
51
- SemanticLogger.add_appender(path, nil, &formatter)
76
+ options = config.rails_semantic_logger.ap_options
77
+ formatter = config.colorize_logging == false ? :default : SemanticLogger::Formatters::Color.new(options)
78
+ # Check for previous file or stdout loggers
79
+ SemanticLogger.appenders.each { |appender| appender.formatter = formatter if appender.is_a?(SemanticLogger::Appender::File) }
80
+ SemanticLogger.add_appender(file_name: path, formatter: formatter)
52
81
  SemanticLogger[Rails]
53
82
  rescue StandardError => exc
54
83
  # If not able to log to file, log to standard error with warning level only
55
84
  SemanticLogger.default_level = :warn
56
85
 
57
- SemanticLogger::Logger.logger = SemanticLogger::Appender::File.new(STDERR)
58
- SemanticLogger.add_appender(STDERR)
86
+ SemanticLogger::Logger.logger = SemanticLogger::Appender::File.new(io: STDERR)
87
+ SemanticLogger.add_appender(io: STDERR)
59
88
 
60
89
  logger = SemanticLogger[Rails]
61
90
  logger.warn(
@@ -116,30 +145,35 @@ module RailsSemanticLogger #:nodoc:
116
145
 
117
146
  # Set the logger for concurrent-ruby
118
147
  Concurrent.global_logger = SemanticLogger[Concurrent] if defined?(Concurrent)
119
- end
120
-
121
- end
122
- end
123
148
 
124
- # Patch the Rails::Server log_to_stdout so that it logs via SemanticLogger
125
- module Rails #:nodoc:
126
- class Server #:nodoc:
127
- private
128
-
129
- def log_to_stdout
130
- SemanticLogger.add_appender($stdout, &SemanticLogger::Appender::Base.colorized_formatter)
149
+ # Rails Patches
150
+ require('rails_semantic_logger/extensions/action_cable/tagged_logger_proxy') if defined?(ActionCable::Connection::TaggedLoggerProxy)
151
+ require('rails_semantic_logger/extensions/action_controller/live') if defined?(ActionController::Live)
152
+ require('rails_semantic_logger/extensions/action_dispatch/debug_exceptions') if defined?(ActionDispatch::DebugExceptions)
153
+ require('rails_semantic_logger/extensions/action_view/streaming_template_renderer') if defined?(ActionView::StreamingTemplateRenderer::Body)
154
+ require('rails_semantic_logger/extensions/active_job/logging') if defined?(ActiveJob::Logging)
155
+
156
+ if config.rails_semantic_logger.semantic
157
+ require('rails_semantic_logger/extensions/rails/rack/logger') if defined?(Rails::Rack::Logger)
158
+ require('rails_semantic_logger/extensions/action_controller/log_subscriber') if defined?(ActionController::LogSubscriber)
159
+ require('rails_semantic_logger/extensions/active_record/log_subscriber') if defined?(ActiveRecord::LogSubscriber)
160
+ end
161
+ unless config.rails_semantic_logger.started
162
+ require('rails_semantic_logger/extensions/rails/rack/logger_info_as_debug') if defined?(Rails::Rack::Logger)
163
+ end
164
+ unless config.rails_semantic_logger.rendered
165
+ require('rails_semantic_logger/extensions/action_view/log_subscriber') if defined?(ActionView::LogSubscriber)
166
+ end
167
+ if config.rails_semantic_logger.processing
168
+ require('rails_semantic_logger/extensions/action_controller/log_subscriber_processing') if defined?(ActionView::LogSubscriber)
169
+ end
131
170
  end
132
- end
133
- end
134
171
 
135
- # Patch ActiveJob logger
136
- if Rails.version.to_f >= 4.2
137
- require 'active_job/logging'
138
-
139
- module ActiveJob::Logging
140
- private
141
- def tag_logger(*tags, &block)
142
- logger.tagged(*tags, &block)
172
+ # Before any initializers run, but after the gems have been loaded
173
+ config.after_initialize do
174
+ # Replace the Bugsnag logger
175
+ Bugsnag.configure { |config| config.logger = SemanticLogger[Bugsnag] } if defined?(Bugsnag)
143
176
  end
144
177
  end
145
178
  end
179
+
@@ -1,3 +1,3 @@
1
1
  module RailsSemanticLogger #:nodoc
2
- VERSION = '3.0.1'
2
+ VERSION = '3.1.0'
3
3
  end
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_semantic_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-14 00:00:00.000000000 Z
11
+ date: 2016-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3.2'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: semantic_logger
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '3.0'
33
+ version: '3.1'
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '3.0'
40
+ version: '3.1'
27
41
  description: Replaces the default Rails logger with SemanticLogger
28
42
  email:
29
43
  - reidmo@gmail.com
@@ -35,11 +49,23 @@ files:
35
49
  - README.md
36
50
  - Rakefile
37
51
  - lib/rails_semantic_logger.rb
52
+ - lib/rails_semantic_logger/extensions/action_cable/tagged_logger_proxy.rb
53
+ - lib/rails_semantic_logger/extensions/action_controller/live.rb
54
+ - lib/rails_semantic_logger/extensions/action_controller/log_subscriber.rb
55
+ - lib/rails_semantic_logger/extensions/action_controller/log_subscriber_processing.rb
56
+ - lib/rails_semantic_logger/extensions/action_dispatch/debug_exceptions.rb
57
+ - lib/rails_semantic_logger/extensions/action_view/log_subscriber.rb
58
+ - lib/rails_semantic_logger/extensions/action_view/streaming_template_renderer.rb
59
+ - lib/rails_semantic_logger/extensions/active_job/logging.rb
60
+ - lib/rails_semantic_logger/extensions/active_record/log_subscriber.rb
61
+ - lib/rails_semantic_logger/extensions/rails/rack/logger.rb
62
+ - lib/rails_semantic_logger/extensions/rails/rack/logger_info_as_debug.rb
63
+ - lib/rails_semantic_logger/extensions/rails/server.rb
38
64
  - lib/rails_semantic_logger/railtie.rb
39
65
  - lib/rails_semantic_logger/version.rb
40
66
  homepage: https://github.com/rocketjob/rails_semantic_logger
41
67
  licenses:
42
- - Apache License V2.0
68
+ - Apache-2.0
43
69
  metadata: {}
44
70
  post_install_message:
45
71
  rdoc_options: []