wfgilman
Example of using Logger.metadata
Can someone provide an example of how you would attach metadata to a process using metatdata/1? If I have a GenServer say that accepts messages with a user_id. Where would I add the user_id to the metadata so that it’s printed in the logging? I’ve been searching the docs and online, but feel I need an example to drive home the concept.
Marked As Solved
smpallen99
Given the following entry in your config file:
config :logger, :console, format: "[$level] $metadata$message\n",
metadata: [:module, :function, :my_id]
You can do the following;
iex(1)> require Logger
Logger
iex(2)> Logger.info "test"
[info] module= function= test
:ok
iex(3)> Logger.info "test", [my_id: 123]
[info] module= function= my_id=123 test
:ok
iex(4)> Logger.metadata [my_id: 999]
:ok
iex(5)> Logger.info "another test"
[info] module= function= my_id=999 another test
:ok
iex(6)>
I added the :module and :function into the meta data, as an example of other meta data you might want. However, since I’m running it from iex, the don’t print anything useful.
Also Liked
smpallen99
@minhajuddin That is a good point. Glad you emphasis that.
It does, however, lend itself to a model where you have a process for each item in some collection. By setting metadata for that process at startup (presumedly with some id or name) its an easy way to identify the logs for the given item of the collection.
Exadra37
To log this I use in runtime.exs:
config :logger, :default_formatter,
# 18:29:12.987 | error | module=MyApp.Some.Module function=some_function/arity line=some_number | some message here
format: "$time | $level | $metadata | $message\n",
metadata: [
:request_id,
:module,
:function,
:line
]
wfgilman
Last Post!
Exadra37
To improve the logger metadata I use this function:
def enhance_metadata(%{} = metadata) do
context_hash = :crypto.hash(:md5, inspect(metadata)) |> Base.encode16()
%{
log_id: UUIDv7.generate(),
context_hash: context_hash,
context: metadata
}
end
And the updated config:
config :logger, :default_formatter,
# 22:44:55.512 |> error |> "some good reason" |> log_id=0199e4e5-e458-78d8-b623-31539c4db8b5 context_hash=4C0CAE343D9B60CADC8BD53D5BB84563 module=EmCanvas.Canvas.Items.AllPositions.ListAllItemsPositions function=list/1 line=18
format: "$time |> $level |> $message |> $metadata\n",
metadata: [
:request_id,
:log_id,
:context_hash,
:module,
:function,
:line
]
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex









