Packages
logger_json
3.0.3
7.0.4
7.0.3
7.0.2
7.0.1
7.0.0
6.2.1
6.2.0
6.0.3
6.0.2
6.0.1
6.0.0
6.0.0-rc.4
6.0.0-rc.3
6.0.0-rc.2
6.0.0-rc.1
6.0.0-rc.0
5.1.4
5.1.3
5.1.2
5.1.1
5.1.0
5.0.0
4.3.0
4.2.0
4.1.0
4.0.0
3.3.0
3.2.0
3.1.2
3.1.1
3.1.0
3.0.3
3.0.2
3.0.1
3.0.0
2.0.1
2.0.0
1.3.0
1.2.1
1.2.0
1.1.0
1.0.1
1.0.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
This package includes a set of :logger formatters designed to output logs in JSON format. It is compatible with a variety of log management systems that support JSON, including Google Cloud Logging and Error Reporting, Datadog, ElasticSearch, LogStash, FileBeat, and Kibana.
Current section
Files
Jump to
Current section
Files
lib/logger_json/plug.ex
if Code.ensure_loaded?(Plug) do
defmodule LoggerJSON.Plug do
@moduledoc """
A Plug to log request information in JSON format.
"""
alias Plug.Conn
alias LoggerJSON.Plug.MetadataFormatters
require Logger
@behaviour Plug
@doc """
Initializes the Plug.
### Available options
* `:level` - log level which is used to log requests;
* `:version_header` - request header which is used to determine API version requested by
client, default: `x-api-version`;
* `:metadata_formatter` - module with `build_metadata/3` function that formats the metadata
before it's sent to logger, default - `LoggerJSON.Plug.MetadataFormatters.GoogleCloudLogger`.
### Available metadata formatters
* `LoggerJSON.Plug.MetadataFormatters.GoogleCloudLogger` leverages GCP LogEntry format;
* `LoggerJSON.Plug.MetadataFormatters.ELK` see module for logged structure.
"""
@impl true
def init(opts) do
level = Keyword.get(opts, :log, :info)
client_version_header = Keyword.get(opts, :version_header, "x-api-version")
metadata_formatter = Keyword.get(opts, :metadata_formatter, MetadataFormatters.GoogleCloudLogger)
{level, metadata_formatter, client_version_header}
end
@impl true
def call(conn, {level, metadata_formatter, client_version_header}) do
start = System.monotonic_time()
Conn.register_before_send(conn, fn conn ->
latency = System.monotonic_time() - start
metadata = metadata_formatter.build_metadata(conn, latency, client_version_header)
Logger.log(level, "", metadata)
conn
end)
end
@doc false
def get_header(conn, header) do
case Conn.get_req_header(conn, header) do
[] -> nil
[val | _] -> val
end
end
end
end