lib/heavylog.rb in heavylog-0.0.1 vs lib/heavylog.rb in heavylog-0.0.2
- old
+ new
@@ -1,5 +1,98 @@
-require "heavylog/version"
+# frozen_string_literal: true
+require 'heavylog/version'
+require 'heavylog/formatters/raw'
+require 'heavylog/formatters/json'
+require 'heavylog/log_subscriber'
+require 'heavylog/middleware'
+require 'heavylog/ordered_options'
+require 'heavylog/request_logger'
module Heavylog
- # Your code goes here...
+ module_function
+
+ mattr_accessor :logger, :application, :formatter, :log_level
+
+ def setup(app)
+ self.application = app
+ patch_loggers
+ attach_to_action_controller
+ setup_custom_payload
+ set_options
+ end
+
+ def patch_loggers
+ Rails.logger.extend(RequestLogger)
+ end
+
+ def set_options
+ f = File.open(config.path, 'a')
+ f.binmode
+ f.sync = true
+
+ Heavylog.logger = ActiveSupport::Logger.new(f)
+ Heavylog.formatter = config.formatter || Heavylog::Formatters::Raw.new
+ Heavylog.log_level = config.log_level || :info
+ end
+
+ def attach_to_action_controller
+ Heavylog::LogSubscriber.attach_to :action_controller
+ end
+
+ def setup_custom_payload
+ return unless config.custom_payload_method.respond_to?(:call)
+
+ klasses = Array(config.base_controller_class)
+ klasses.map! { |klass| klass.try(:constantize) }
+ klasses.push(ActionController::Base) if klasses.empty?
+ klasses.each { |klass| extend_base_controller_class(klass) }
+ end
+
+ def extend_base_controller_class(klass)
+ append_payload_method = klass.instance_method(:append_info_to_payload)
+ custom_payload_method = config.custom_payload_method
+
+ klass.send(:define_method, :append_info_to_payload) do |payload|
+ append_payload_method.bind(self).call(payload)
+ payload[:custom_payload] = custom_payload_method.call(self)
+ end
+ end
+
+ def log(severity, message = nil, progname = nil, &block)
+ return if !config.enabled
+
+ uuid = RequestStore.store[:heavylog_request_id]
+ return if !uuid
+
+ if message.nil?
+ if block_given?
+ message = yield
+ else
+ message = progname
+ end
+ end
+
+ RequestStore.store[:heavylog_buffer] ||= StringIO.new
+ RequestStore.store[:heavylog_buffer].puts(message)
+ end
+
+ def finish
+ return if !config.enabled
+
+ buffer = RequestStore.store[:heavylog_buffer]
+ return if !buffer
+
+ request = {
+ request_id: RequestStore.store[:heavylog_request_id],
+ messages: buffer.string.dup
+ }.merge(RequestStore.store[:heavylog_request_data] || {})
+
+ formatted = Heavylog.formatter.call(request)
+ Heavylog.logger.send(Heavylog.log_level, formatted)
+ end
+
+ def config
+ application.config.heavylog
+ end
end
+
+require 'heavylog/railtie' if defined?(Rails)