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

configuration(&block)
Alias for: configure
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