module LogStashLogger
Forked from github.com/jordansissel/ruby-stud/blob/master/lib/stud/buffer.rb
Code originally from: stackoverflow.com/a/6410202
Adapted from github.com/ffmike/multilogger
Add support for Rails-style logger silencing. Thread-safe and no dependencies.
Setup:
logger = Logger.new(STDOUT) logger.extend(LogStashLogger::SilencedLogging)
Usage:
logger.silence do ... end
Constants
- VERSION
Attributes
device[R]
Public Class Methods
configure(&block)
click to toggle source
# File lib/logstash-logger/configuration.rb, line 3 def configure(&block) @configuration = Configuration.new(&block) if block_given? || @configuration.nil? @configuration end
Also aliased as: configuration
extended(base)
click to toggle source
# File lib/logstash-logger/logger.rb, line 13 def self.extended(base) base.instance_eval do class << self attr_reader :device end def flush !!(@device.flush if @device.respond_to?(:flush)) end def reset @device.reset if @device.respond_to?(:reset) end end end
new(*args)
click to toggle source
# File lib/logstash-logger/logger.rb, line 8 def self.new(*args) opts = extract_opts(*args) build_logger(opts) end
sanitize_logger_options(app, logger_options)
click to toggle source
# File lib/logstash-logger/railtie.rb, line 24 def self.sanitize_logger_options(app, logger_options) # Convert logger options to OrderedOptions if regular Hash logger_options = ActiveSupport::OrderedOptions.new.merge(logger_options) if parsed_uri_options = LogStashLogger::Device.parse_uri_config(logger_options) logger_options.delete(:uri) logger_options.merge!(parsed_uri_options) end if logger_options.type == :file logger_options.path ||= app.config.paths["log"].first end if app.config.respond_to?(:autoflush_log) logger_options.sync = app.config.autoflush_log end logger_options end
setup(app)
click to toggle source
# File lib/logstash-logger/railtie.rb, line 4 def self.setup(app) return unless app.config.logstash.present? logger_options = app.config.logstash sanitized_logger_options = if logger_options.is_a?(Array) logger_options.map do |opts| sanitize_logger_options(app, opts) end else sanitize_logger_options(app, logger_options) end logger = LogStashLogger.new(sanitized_logger_options) logger.level = ::Logger.const_get(app.config.log_level.to_s.upcase) app.config.logger = logger end
Protected Class Methods
build_logger(opts)
click to toggle source
# File lib/logstash-logger/logger.rb, line 52 def self.build_logger(opts) formatter = Formatter.new(opts.delete(:formatter), customize_event: opts.delete(:customize_event)) logger_type = opts[:type].to_s.to_sym logger = case logger_type when :multi_logger build_multi_logger(opts) when :syslog build_syslog_logger(opts) else build_default_logger(opts) end logger.formatter = formatter if formatter logger end
extract_opts(*args)
click to toggle source
# File lib/logstash-logger/logger.rb, line 31 def self.extract_opts(*args) args.flatten! if args.length > 1 if args.all?{|arg| arg.is_a?(Hash)} # Deprecated array of hashes warn "[LogStashLogger] Passing an array of hashes to the constructor is deprecated. Please replace with an options hash: { type: :multi_delegator, outputs: [...] }" { type: :multi_delegator, outputs: args } else # Deprecated host/port/type constructor warn "[LogStashLogger] The (host, port, type) constructor is deprecated. Please use an options hash instead." host, port, type = *args { host: host, port: port, type: type } end elsif Hash === args[0] args[0] else fail ArgumentError, "Invalid LogStashLogger options" end end
Private Class Methods
build_default_logger(opts)
click to toggle source
# File lib/logstash-logger/logger.rb, line 71 def self.build_default_logger(opts) logger_class = opts.delete(:logger_class) || ::Logger device = Device.new(opts) logger_class.new(device).tap do |logger| logger.instance_variable_set(:@device, device) extend_logger(logger) end end
build_multi_logger(opts)
click to toggle source
# File lib/logstash-logger/logger.rb, line 80 def self.build_multi_logger(opts) output_configurations = opts.delete(:outputs) || [] loggers = output_configurations.map do |config| logger_opts = opts.merge(config) build_logger(logger_opts) end MultiLogger.new(loggers) end
build_syslog_logger(opts)
click to toggle source
# File lib/logstash-logger/logger.rb, line 89 def self.build_syslog_logger(opts) logger = begin require 'syslog/logger' Syslog::Logger.new(opts[:program_name], opts[:facility]) rescue ArgumentError Syslog::Logger.new(opts[:program_name]) end extend_logger(logger) end
extend_logger(logger)
click to toggle source
# File lib/logstash-logger/logger.rb, line 101 def self.extend_logger(logger) logger.extend(self) logger.extend(TaggedLogging) logger.extend(SilencedLogging) end
Public Instance Methods
flush()
click to toggle source
# File lib/logstash-logger/logger.rb, line 19 def flush !!(@device.flush if @device.respond_to?(:flush)) end
reset()
click to toggle source
# File lib/logstash-logger/logger.rb, line 23 def reset @device.reset if @device.respond_to?(:reset) end