MetaLogger is a wrapper for Elixir Logger
that keeps and returns the logger metadata from the
caller processes.
The package can be installed by adding meta_logger
to your list of dependencies in mix.exs
:
def deps do
[
{:meta_logger, "~> 1.8.0"}
]
end
MetaLogger requires Elixir 1.10 or greater. For previous Elixir versions use MetaLogger 0.1.0
.
Just replace Logger
with MetaLogger
, there is no need to require it before using:
MetaLogger.[debug|error|info|log|warning](...)
For processes that can continue running after the parent process ends, the MetaLogger
will not
be able to get the caller processes metadata if the parent process is finished. In this case, the
MetaLogger.metadata/0
function can be used to store the metadata before the process starts:
metadata = MetaLogger.metadata()
Task.async(fn ->
Logger.metadata(metadata)
end)
A middleware to log requests and responses using Tesla.
If you want to use the MetaLogger Tesla middleware, optional dependencies are required. Add the
following to your mix.exs
:
def deps do
[
{:tesla, "~> 1.4"},
{:miss, "~> 0.1"}
]
end
defmodule MyClient do
use Tesla
plug Tesla.Middleware.MetaLogger,
filter_body: {~r/email=.*&/, "email=[FILTERED]&"}
filter_headers: ["authorization"],
filter_query_params: [:api_key],
log_level: :debug,
log_tag: MyApp,
max_entry_length: 22_000
end
See the Tesla.Middleware.MetaLogger
documentation for the options definition.
It is possible to define an implementation for a custom struct, so MetaLogger will know how to format log messages. It also includes the possibility to filter some data using regexp patterns.
It could be useful, when there is a defined struct with sensitive information, for example after an HTTP request. If you own the struct, you can derive the implementation specifying a formatter function and patterns which will be filtered.
The struct for which implementation will be used must have the payload
field, which is used as
input for the defined format function.
MetaLogger.log/3
accepts the structs which derives MetaLogger.Formatter
implementation.
defmodule ClientFormatterImpl do
@derive {
MetaLogger.Formatter,
formatter_fn: &__MODULE__.format/1,
filter_patterns: [
{~s/"name":".*"/, ~s/"name":"[FILTERED]"/},
"very_secret_word"
]
}
def build(payload) do
struct!(__MODULE__, payload: payload)
end
def format(%{foo: foo}) do
"Very useful but filtered information: #{inspect(foo)}"
end
end
# Inside the build function a logic can be defined to extract an useful payload
# which needs to belogged, e.g. a request and response information.
http_request
|> ClientFormatterImpl.build()
|> then(fn log_struct -> MetaLogger.log(:debug, log_struct) end)
:formatter_fn
(required) - The function which is used to format a given payload. The function must return a string or a list of strings.:filter_patterns
(optional) - Regex patterns which will be used to replace sensitive information in a payload. It is a list of strings or tuples (can be mixed). If tuples are given, the first element is used as a regex pattern to match, and the second is as a replacement which will be used to replace it. E.g.{~s/"name": ".+"/, ~s/"name": "[FILTERED]"/}
.
The full documentation is available at https://hexdocs.pm/meta_logger.
See the contributing guide.
MetaLogger is released under the Apache 2.0 License. See the LICENSE file.
Copyright © 2019-2021 FindHotel