Logging Journald

by Lukas Zapletal

Description

Logging Journald is a plugin for logging gem - the flexible logging library for use in Ruby programs. It supports logging to system journal via journald-logger and journald-native gems.

Installation

gem install logging-journald

The gem provides journald appender and noop layout that does no formatting since core library does not provide such a layout. Apppender options are:

  • name - name of the appender (required)
  • ident - optional log ident (appender name by default)
  • layout - optional layout (no formatting by default)
  • mdc - log mdc into custom journal fields (true by default)
  • ndc - log ndc hash values into custom journal fields (true by default)
  • facility - optional syslog facility rendered as SYSLOG_FACILITY (LOG_USER (8) by default)
  • extra - extra custom journal fields as hash

All custom fields are converted to uppercase by joudnald automatically, for more details visit official documentation.

Examples

Use MDC to send arbitrary key/value pairs to system journal:

require 'logging'

log = Logging.logger['app']
log.add_appenders(Logging.appenders.journald('myservice'))

# use mapped diagnostic context to send custom fields
Logging.mdc['signed_user'] = 'Ondra'
logger.debug "blah blah"

The example above will be rendered as:

# journalctl -o verbose
  MESSAGE=blah blah
  SYSLOG_FACILITY=8
  SIGNED_USER=Ondra
  PRIORITY=2
  SYSLOG_IDENTIFIER=myapp
  _PID=25979
  _TRANSPORT=journal
  _UID=1000
  _GID=1000
  _MACHINE_ID=xxx
  _HOSTNAME=xxx
  _BOOT_ID=xxx
  ...

Mapped diagnostic contexts are great for global values like logged user, request or session id. There are two more options to send arbitrary key/value pairs:

require 'logging'

log = Logging.logger['app']
log.add_appenders(Logging.appenders.journald('myservice'))

# nested diagnostic context is a stack of values and
# it can be used but only hashes are taken into account
begin
  Logging.ndc << { exception: err, backtrace: err.backtrace }
  log.fatal "an exception occured"
ensure
  Logging.ndc.clear
end

# hash can be provided instead of string but in this case
# layout cannot be used to format message in the system journal
log.info message: "this must be called 'message'", akey: "a value"

There are some examples in the examples folder.

License

The MIT License - see the LICENSE file for the full text.