A plug for formatting your logs for kibana/graylog/etc in the CEE (or lumberjack?) format, or just json. Like:
@cee {"foo":"bar"}
The package can be installed by adding cee_log_formatter to your list of dependencies in
mix.exs:
def deps do
[
{:cee_log_formatter, "~> 0.1"}
]
endThen set the format of your logs in production:
# config/prod.exs
config :logger, :console,
level: :info,
format: {CeeLogFormatter, :format}You can change the prefix line (if you just want json):
config :cee_log_formatter,
prefix: ""By default CeeLogFormatter will try to use Poison to encode and decode JSON, but you can configure it to any other json library that implements encode!() and decode!() callbacks:
config :cee_log_formatter, :json_library, JasonYou can add metadata to all your requests via config options:
config :cee_log_formatter,
metadata: [
app_name: "my-app",
arbitrary_mfa: {MyMod, :some_func, [:arg1, :arg2]}
]The metadata config takes a keyword list. If the value is a string, it is used directly in the
log output. If the value is a 3-element tuple, it is expected to be a {Module, function, argument-list}, which is called for every log line to get some current value. If the value
returned from the MFA is not a string, it is ignored.
For instance, you could have the current unix timestamp added to the log with:
defmodule TimestampLog do
def current(resolution) do
"#{:os.system_time(resolution)}"
end
end
# in config.exs
config :cee_log_formatter,
metadata: [
timestamp: {TimestampLog, :current, [:second]}
]You should also use the PlugLoggerJson package, which configures plug to output logs as maps so the formatter gets more info.