LoggerExporter
Export your logs to the service of your choice.
I created this library because I wanted to export logs to a different service in Heroku. There is no simple way to export your logs.
Supported exporters:
- Loki
Implement your own exporter using LoggerExporter.Exporters.Exporter behaviour.
Supported formatters:
- Basic
Implement your own formatter using LoggerExporter.Formatters.Formatter behaviour.
Installation
Add logger_exporter to your list of dependencies in mix.exs:
def deps do
[
{:logger_exporter, "~> 0.1.0"}
]
end
Configuration
By default, the timestamp sent for each log to the external service is in utc: System.os_time(:nanosecond)
config :logger, LoggerExporter, :level. The logger level to report.config :logger, LoggerExporter, :formatter. Allows the selection of a formatter implementation. Defaults toLoggerExporter.Formatters.BasicFormatterconfig :logger, LoggerExporter, :metadata. Metadata to log. Defaults to[]config :logger, LoggerExporter, :exporter. Allows selection of a exporter implementation. Defaults toLoggerExporter.Exporters.LokiExporterconfig :logger, LoggerExporter, :batch_every_ms. The time (in ms) between every batch request. Default value is 2000 (2 seconds)config :logger, LoggerExporter, :host. The host of the service without the path. The path is inferred by the exporter. Requiredconfig :logger, LoggerExporter, :app_name. The name of the app to use as label forLoki. Required if usingLokiExporterconfig :logger, LoggerExporter, :environment_name. The name of the environment to use as label forLoki. Required if usingLokiExporterconfig :logger, :send_to_httpIf set to false, the library will not make any actual API calls. This is useful for test or dev environments. Default value is trueconfig :logger, LoggerExporter, :http_auth. See below
HTPP Auth
Supported authentication methods:
Basic:
config :logger, LoggerExporter,host: "https://logs-prod.grafana.net",http_auth: {:basic, System.fetch_env!("USER"), System.fetch_env!("PASSWORD")}
Usage in Phoenix
Add the following to deps section of your mix.exs:
{:logger_exporter, "~> 0.1.0"}and thenmix deps.getAdd
LoggerExporter.Backendto your logger's backends configurationconfig :logger,backends: [:console, LoggerExporter.Backend]Add config related to the exporter and other fields. ie. for
LokiExporterconfig :logger, LoggerExporter,host: "http://localhost:3100",app_name: "my_app",environment_name: Mix.env(),http_auth: {:basic, System.fetch_env!("LOKI_USER"), System.fetch_env!("LOKI_PASSWORD")},metadata: [:request_id]Start the LoggerExporter GenServer in the supervised children list. In
application.exadd to the children list:children [...LoggerExporter]
JSON Formatter
If you want to log in JSON format, you can use the formatter of another library: logger_json
You can configure it like this:
config :logger, LoggerExporter,
formatter: LoggerJSON.Formatters.BasicLogger
And it will work out of the box :)
Telemetry
Telemetry integration for logging and error reporting.
There is a default logger for you to attach. It logs when the status is :error
In your application.ex
:ok = LoggerExporter.Telemetry.attach_default_logger()
HTTP Post batch events
LoggerExporter emits the following events for processing each batch (sending it through http)
[:logger_exporter, :batch, :start]-- starting to process the events[:logger_exporter, :batch, :stop]-- after the events is processed[:logger_exporter, :batch, :exception]-- after the events are processed
The following chart shows which metadata you can expect for each event:
| event | measures | metadata |
|---|---|---|
:start | :system_time | :events |
:stop | :duration | :events, :status, :response |
:exception | :duration | :events, :kind, :reason, :stacktrace |
Metadata
:events- the list ofLoggerExporter.Eventprocessed:status- either:okor:error:response- information of the response. Is aFinch.Responsestruct