class SemanticLogger::Appender::Graylog

Attributes

gelf_options[RW]
level_map[RW]
max_size[RW]
notifier[R]
port[R]
protocol[R]
server[R]
url[RW]

Public Class Methods

new(url: "udp://localhost:12201", max_size: "WAN", gelf_options: {}, level_map: LevelMap.new, **args, &block) click to toggle source

Create Graylog log appender.

Options:

url: [String]
  Valid URL to post to.
  Log to UDP Example:
    'udp://localhost:12201'
  Log to TCP Example:
    'tcp://localhost:12201'
  Default: 'udp://localhost:12201'

max_size: [String]
  Max udp packet size. Ignored when protocol is :tcp
  Default: "WAN"

gelf_options: [Hash]
  Custom gelf options. See Graylog documentation.

level: [:trace | :debug | :info | :warn | :error | :fatal]
  Override the log level for this appender.
  Default: SemanticLogger.default_level

formatter: [Object|Proc]
  An instance of a class that implements #call, or a Proc to be used to format
  the output from this appender
  Default: Use the built-in formatter (See: #call)

filter: [Regexp|Proc]
  RegExp: Only include log messages where the class name matches the supplied.
  regular expression. All other messages will be ignored.
  Proc: Only include log messages where the supplied Proc returns true
        The Proc must return true or false.

host: [String]
  Name of this host to appear in log messages.
  Default: SemanticLogger.host

application: [String]
  Name of this application to appear in log messages.
  Default: SemanticLogger.application
Calls superclass method SemanticLogger::Subscriber::new
# File lib/semantic_logger/appender/graylog.rb, line 85
def initialize(url: "udp://localhost:12201",
               max_size: "WAN",
               gelf_options: {},
               level_map: LevelMap.new,
               **args,
               &block)

  @url          = url
  @max_size     = max_size
  @gelf_options = gelf_options
  @level_map    = level_map.is_a?(LevelMap) ? level_map : LevelMap.new(level_map)

  super(**args, &block)
  reopen
end

Public Instance Methods

call(log, logger) click to toggle source

Returns [Hash] of parameters to send

# File lib/semantic_logger/appender/graylog.rb, line 120
def call(log, logger)
  h = default_formatter.call(log, logger)

  h[:short_message] = h.delete(:message)
  if h[:short_message].nil?
    h[:short_message] = log.exception.nil? ? "<no-exception-message>" : log.exception.message
  end
  h[:level]        = logger.level_map[log.level]
  h[:level_str]    = log.level.to_s
  h[:duration_str] = h.delete(:duration)
  h
end
log(log) click to toggle source

Forward log messages

# File lib/semantic_logger/appender/graylog.rb, line 134
def log(log)
  notifier.notify!(formatter.call(log, self))
  true
end
reopen() click to toggle source

Re-open after process fork

# File lib/semantic_logger/appender/graylog.rb, line 102
def reopen
  uri       = URI.parse(@url)
  @server   = uri.host
  @port     = uri.port
  @protocol = uri.scheme.to_sym

  unless %i[udp tcp].include?(@protocol)
    raise(ArgumentError, "Invalid protocol value: #{@protocol}. Must be :udp or :tcp")
  end

  gelf_options[:protocol] ||= (@protocol == :tcp ? GELF::Protocol::TCP : GELF::Protocol::UDP)
  gelf_options[:facility] ||= application

  @notifier                       = GELF::Notifier.new(server, port, max_size, gelf_options)
  @notifier.collect_file_and_line = false
end

Private Instance Methods

default_formatter() click to toggle source
# File lib/semantic_logger/appender/graylog.rb, line 141
def default_formatter
  SemanticLogger::Formatters::Raw.new(time_format: :seconds, time_key: :timestamp)
end