Skip to content

viodotcom/meta_logger

Repository files navigation

MetaLogger

Hex.pm Docs Build Status License

MetaLogger is a wrapper for Elixir Logger that keeps and returns the logger metadata from the caller processes.

Installation

The package can be installed by adding meta_logger to your list of dependencies in mix.exs:

def deps do
  [
    {:meta_logger, "~> 1.7.0"}
  ]
end

MetaLogger requires Elixir 1.10 or greater. For previous Elixir versions use MetaLogger 0.1.0.

Usage

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)

Tesla Middleware

A middleware to log requests and responses using Tesla.

Installation

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

Usage example

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

Options

See the Tesla.Middleware.MetaLogger documentation for the options definition.

MetaLogger.Formatter protocol

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.

Usage

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)

Options

  • :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]"/}.

Full documentation

The full documentation is available at https://hexdocs.pm/meta_logger.

Contributing

See the contributing guide.

License

MetaLogger is released under the Apache 2.0 License. See the LICENSE file.

Copyright © 2019-2021 FindHotel

Author

FindHotel

FindHotel loves Elxir!

About

A wrapper for Elixir Logger that keeps and returns the logger metadata from the caller processes.

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks