lib/logstasher.rb in logstasher-0.4.1 vs lib/logstasher.rb in logstasher-0.4.5

- old
+ new

@@ -3,94 +3,99 @@ require 'active_support/core_ext/module/attribute_accessors' require 'active_support/core_ext/string/inflections' require 'active_support/ordered_options' module LogStasher - # Logger for the logstash logs - mattr_accessor :logger, :enabled + extend self + attr_accessor :logger, :enabled - def self.remove_existing_log_subscriptions + def remove_existing_log_subscriptions ActiveSupport::LogSubscriber.log_subscribers.each do |subscriber| case subscriber when ActionView::LogSubscriber unsubscribe(:action_view, subscriber) when ActionController::LogSubscriber unsubscribe(:action_controller, subscriber) end end end - def self.unsubscribe(component, subscriber) + def unsubscribe(component, subscriber) events = subscriber.public_methods(false).reject{ |method| method.to_s == 'call' } events.each do |event| ActiveSupport::Notifications.notifier.listeners_for("#{event}.#{component}").each do |listener| if listener.instance_variable_get('@delegate') == subscriber ActiveSupport::Notifications.unsubscribe listener end end end end - def self.add_default_fields_to_payload(payload, request) + def add_default_fields_to_payload(payload, request) payload[:ip] = request.remote_ip payload[:route] = "#{request.params[:controller]}##{request.params[:action]}" payload[:parameters] = payload[:params].except(*ActionController::LogSubscriber::INTERNAL_PARAMS) self.custom_fields += [:ip, :route, :parameters] end - def self.add_custom_fields(&block) + def add_custom_fields(&block) ActionController::Metal.send(:define_method, :logtasher_add_custom_fields_to_payload, &block) ActionController::Base.send(:define_method, :logtasher_add_custom_fields_to_payload, &block) end - def self.setup(app) + def setup(app) app.config.action_dispatch.rack_cache[:verbose] = false if app.config.action_dispatch.rack_cache # Path instrumentation class to insert our hook require 'logstasher/rails_ext/action_controller/metal/instrumentation' require 'logstash-event' self.suppress_app_logs(app) LogStasher::RequestLogSubscriber.attach_to :action_controller - self.logger = app.config.logstasher.logger || Logger.new("#{Rails.root}/log/logstash_#{Rails.env}.log") + self.logger = app.config.logstasher.logger || new_logger("#{Rails.root}/log/logstash_#{Rails.env}.log") self.logger.level = app.config.logstasher.log_level || Logger::WARN self.enabled = true end - def self.suppress_app_logs(app) + def suppress_app_logs(app) if configured_to_suppress_app_logs?(app) require 'logstasher/rails_ext/rack/logger' LogStasher.remove_existing_log_subscriptions end end - def self.configured_to_suppress_app_logs?(app) + def configured_to_suppress_app_logs?(app) # This supports both spellings: "suppress_app_log" and "supress_app_log" !!(app.config.logstasher.suppress_app_log.nil? ? app.config.logstasher.supress_app_log : app.config.logstasher.suppress_app_log) end - def self.custom_fields + def custom_fields Thread.current[:logstasher_custom_fields] ||= [] end - def self.custom_fields=(val) + def custom_fields=(val) Thread.current[:logstasher_custom_fields] = val end - def self.log(severity, msg) + def log(severity, msg) if self.logger && self.logger.send("#{severity}?") event = LogStash::Event.new('@fields' => {:message => msg, :level => severity},'@tags' => ['log']) self.logger.send severity, event.to_json end end - class << self - %w( fatal error warn info debug unknown ).each do |severity| - eval <<-EOM, nil, __FILE__, __LINE__ + 1 - def #{severity}(msg) - self.log(:#{severity}, msg) - end - EOM - end + %w( fatal error warn info debug unknown ).each do |severity| + eval <<-EOM, nil, __FILE__, __LINE__ + 1 + def #{severity}(msg) + self.log(:#{severity}, msg) + end + EOM + end + + private + + def new_logger(path) + FileUtils.touch path # prevent autocreate messages in log + Logger.new path end end require 'logstasher/railtie' if defined?(Rails)