wfgilman

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

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

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

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

wfgilman

This is exactly what I was looking for. Thank you!

minhajuddin

minhajuddin

One thing to note about Logger.metadata is that it is set only for the current process. From the documentation

https://hexdocs.pm/logger/Logger.html#metadata/1

## Metadata

Metadata to be sent to the Logger can be read and written with the
Logger.metadata/0 and Logger.metadata/1 functions. For example, you can set
Logger.metadata([user_id: 13]) to add user_id metadata to the current process.
The user can configure the backend to chose which metadata it wants to print
and it will replace the $metadata value.
wfgilman

wfgilman

That’s the route I’ve gone thanks to your advice. Very helpful.

Where Next?

Popular in Questions Top

joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 record...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
mathew4509
I have a list say x = ["23gh", "56kh", "97mh"] I would like to pass each element to Val in each iteration. Say, in iteration 1 -------...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
chrisalley
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
Exadra37
Sometimes I want to check if the input into a function is not a blank string. My first approach: defmodule Example do def do_stuff(s...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New

Other popular topics Top

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list....
New
peerreynders
Manning 2016 Halloween weekend sale via Deal of the Day Friday, October 28 - Half off all MEAPs - code WM102816LT Saturday, October 29 ...
326 29600 154
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 35421 110
New
Jim
As a follow up to my earlier question: I have the code compiling and running but not getting a successful login from the rest server. ...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? https://hexdocs.pm/ecto/Ecto.Repo.h...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
AstonJ
We’ve put together this wiki for Phoenix LiveView - please feel free to add any info you feel is worth including. What is Phoenix LiveV...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New

We're in Beta

About us Mission Statement