LoggerHumioBackend

About

A Elixir Logger backend for Humio.

Using it with Mix

To use it in your Mix projects, first add it as a dependency:

def deps do
  [{:logger_humio_backend, "~> 0.2"}]
end

Then run mix deps.get to install it.

Configuration

Required

Optional

Configuration Examples

Runtime

Logger.add_backend {Logger.Backend.Humio, :debug}
Logger.configure {Logger.Backend.Humio, :debug},
  format: "[$level] $message\n"
  host: "https://humio-ingest.bigcorp.com:443",
  level: :debug,
  token: "ingest-token-goes-here",

Application config

Minimal
config :logger,
  utc_log: true #recommended
  backends: [{Logger.Backend.Humio, :humio_log}, :console]

config :logger, :humio_log,
  host: "https://humio-ingest.bigcorp.com:443/",
  token: "ingest-token-goes-here",
With All Options
config :logger,
  utc_log: true #recommended
  backends: [{Logger.Backend.Humio, :humio_log}, :console]

config :logger, :humio_log,
  host: "https://humio-ingest.bigcorp.com:443/",
  token: "ingest-token-goes-here",
  format: "[$level] $message\n",
  level: :debug,
  metadata: [:request_id, :customer_id],
  max_batch_size: 50,
  flush_interval_ms: 5_000,
  debug_io_device: :stderr,
  fields: %{
    "service" => "my_service"
  },
  tags: %{
    "env" => "dev"
  }

Batching

The library will batch requests until either

  1. the buffer of logs has reached the max_batch_size or
  2. an amount of time equal to flush_interval_ms has passed.

At this point the logger backend will send all accrued log events to Humio, and reset the flush interval timer.

The logger can be flushed manually by calling Logger.flush(). Note this will flush all registered logger backends.

Metadata

Metadata is sent to Humio as attributes using the Structured Ingest API. This means any metadata you set will be ingested as fields in Humio, and, unlike the :console logger, metadata can not be appended in the Formatter. This is much more powerful than the :console logger, as it enables the ingestion of nested maps, lists, and generally more complex metadata than just string values.

Formatter

This logging backend implements its own formatter, similar to Elixir’s Logger.Formatter.

It allows developers to specify a string that serves as template for log messages, for example:

$hostname[$pid]: [$level]$levelpad $message

Will print error messages as:

localhost[<0.349.0>]: [error] Hello

The valid parameters you can use are:

Plug

The library also includes a Plug that is a drop-in replacement for Plug.Logger

It logs basic request information in the format:

Get /index.html Sent 200 in 5720us

To use it, just plug it into the desired module.

plug Logger.Backend.Humio.Plug

Additionally, the logger ships metadata from the Plug.Conn struct. The backend’s configuration must allow for the key conn to be allowed for this to occur.

The connection’s fields in Humio will have conn. as the suffix. For example, the connection status will be under conn.status, the request_path under conn.request_path, etc.

For a complete list of fields, see the Plug.Conn documentation. The Plug also adds an additional field, response_time_us, which indicates the time it took to process the request in microseconds.

Options

Example Configuration with all options

  pipeline :instrumentation do
    plug Humio.Plug, 
      [
        log: :debug, 
        metadata: [:method, :response_time_us, :port, :host]
      ]
  end