rails_semantic_logger 3.0.1 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []