Module: Log2Json

Defined in:
lib/log2json.rb,
lib/log2json/mlogbuffer.rb,
lib/log2json/railslogger.rb,
lib/log2json/filters/syslog.rb,
lib/log2json/filters/nginx_access.rb

Defined Under Namespace

Modules: Filters Classes: MultilineLogBuffer, Spitter

Constant Summary collapse

LEVELS =
{
  :debug => Logger::DEBUG,
  :info => Logger::INFO,
  :warn => Logger::WARN,
  :error => Logger::ERROR,
  :fatal => Logger::FATAL,
  :unknown => 5
}

Class Method Summary collapse

Class Method Details

.create_custom_rails_logger(config) ⇒ Object

Create a custom logger that uses its own formatting for easier parsing by a log2json log monitoring script.



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/log2json/railslogger.rb', line 38

def self.create_custom_rails_logger(config)
  if config.respond_to?(:paths)  # assume rails 3
    path = config.paths["log"].first
    unless File.exist? File.dirname path
      FileUtils.mkdir_p File.dirname path
    end
    config.colorize_logging = false
  else                           # assume rails 2
    path = config.log_path
    config.active_record.colorize_logging = false 
  end
  logger = ::Logger.new(path)
  logger.level =  LEVELS[config.log_level]
  logger.formatter = ::Log2Json::log_formatter
  if defined?(ActiveSupport::TaggedLogging)
    ActiveSupport::TaggedLogging.new(logger)
  else
    logger
  end
end

.create_custom_unicorn_logger(config) ⇒ Object

Simiar to the custom rails logger, but for unicorn.



61
62
63
64
65
66
# File 'lib/log2json/railslogger.rb', line 61

def self.create_custom_unicorn_logger(config)
  logger = ::Logger.new(config.set[:stderr_path])
  logger.level = Logger::INFO
  logger.formatter = ::Log2Json::log_formatter
  logger
end

.log_formatterObject



28
29
30
31
32
33
# File 'lib/log2json/railslogger.rb', line 28

def self.log_formatter
  proc do |severity, datetime, progname, msg|
    "#{datetime.strftime('%Y-%m-%dT%H:%M:%S%z')}: [#{severity}] #{$$} #{msg.gsub(/\n/, '#012')}\n"
    # Note: Following rsyslog's convention, all newlines are converted to '#012'.
  end
end

.main(filters, opts = {}, &block) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/log2json.rb', line 8

def self.main(filters, opts={}, &block)
  output = opts[:output] || STDOUT
  spitter = opts[:spitter]
  if spitter.nil?
    # configure the spitter to take config overrides from ENV
    config = {}
    Spitter::CONFIG.keys.each do |name|
      key = name.to_s.downcase
      config[name] = ENV[key] if ENV.member?(key)
    end
    spitter = ::Log2Json::Spitter.new(STDIN, ENV['type'], config.merge(opts))
  end
  if block.nil?
    block = proc do |rec|
      if not rec['@timestamp'].nil?
        output.write(rec.to_json() << "\n")
        output.flush()
        # NOTE: Ruby's built-in json module, by default, doesn't output any
        #       literal newline characters while serializing. So using
        #       newlines as json record separator is fine here.
      end
    end
  end
  spitter.each_record do |rec|
    filters[rec['@type']].each do |f|
      rec = f.filter(rec)
      break if rec.nil?
    end
    block.call(rec) unless rec.nil?
  end
end