# Logger and how to specify level?

**URL:** <https://erlangforums.com/t/logger-and-how-to-specify-level/3933>\
**Category:** Questions / Help\
**Tags:** erlang-logger\
**Created:** [August 24, 2024, 9:55am UTC](https://erlangforums.com/t/logger-and-how-to-specify-level/3933 "2024-08-24T09:55:58Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![zabrane](https://erlangforums.com/letter_avatar_proxy/v4/letter/z/7ba0ec/32.png) [@zabrane](https://erlangforums.com/u/zabrane)\
**Post date:** [August 24, 2024, 9:55am UTC](https://erlangforums.com/t/logger-and-how-to-specify-level/3933/1 "2024-08-24T09:55:58Z")

</div>

Hi guys

I’m switching from [lager](https://github.com/erlang-lager/lager) to [logger](https://www.erlang.org/doc/apps/kernel/logger.html).

While I’m able to log `info`, `warn`, and `error` messages using:

- error\_logger:info\_msg/2
- error\_logger:warning\_msg/2
- error\_logger:error\_msg/2

I couldn’t find a way to log messages using the following levels:  
`emergency | alert | critical | info | debug | all | none`

There’s no function such as:  
`error_logger:alert_msg/2`

Finally, how one can define the logging template to get this output format:

```plaintext
2024-08-24T09:49:40.169028+02:00 [alert_level] [module_name.line_number] logged_message_here

```

Many thanks  
Z.

---

<div class="post-metadata">

**Author:** ![chiroptical](https://erlangforums.com/user_avatar/erlangforums.com/chiroptical/32/2044_2.png) [@chiroptical](https://erlangforums.com/u/chiroptical)\
**Post date:** [August 24, 2024, 10:46am UTC](https://erlangforums.com/t/logger-and-how-to-specify-level/3933/2 "2024-08-24T10:46:32Z")

</div>

I believe my Erlang bits episode could be useful to you [https://youtu.be/xMvwYtUkT0A?feature=shared](https://youtu.be/xMvwYtUkT0A?feature=shared). It explains how to log and how to configure the logging levels. I used a structured logging format but you could probably use the configuration example to figure out the style you want.

---

<div class="post-metadata">

**Author:** ![zabrane](https://erlangforums.com/letter_avatar_proxy/v4/letter/z/7ba0ec/32.png) [@zabrane](https://erlangforums.com/u/zabrane)\
**Post date:** [August 24, 2024, 4:18pm UTC](https://erlangforums.com/t/logger-and-how-to-specify-level/3933/3 "2024-08-24T16:18:07Z")

</div>

@chiroptical Thanks. I’ve managed to make it work getting the correct output format.

---

<div class="post-metadata">

**Author:** ![garazdawi](https://erlangforums.com/user_avatar/erlangforums.com/garazdawi/32/175_2.png) [@garazdawi](https://erlangforums.com/u/garazdawi)\
**Post date:** [August 26, 2024, 6:44am UTC](https://erlangforums.com/t/logger-and-how-to-specify-level/3933/4 "2024-08-26T06:44:07Z")

</div>

If you have any suggestions about how the logger documentation could be improved, please let me know, or better yet, submit a pr!

---

<div class="post-metadata">

**Author:** ![zabrane](https://erlangforums.com/letter_avatar_proxy/v4/letter/z/7ba0ec/32.png) [@zabrane](https://erlangforums.com/u/zabrane)\
**Post date:** [August 26, 2024, 8:56am UTC](https://erlangforums.com/t/logger-and-how-to-specify-level/3933/5 "2024-08-26T08:56:35Z")

</div>

@garazdawi Thanks. Let’s take the console logger. In my case, this seems to work:

```erlang
{handler, default, logger_std_h,
 #{config => #{file => "console.log"}

```

But not this:

```erlang
{handler, default, logger_std_h,
 #{config => #{file => "console.log", type => wrap}

```

However, `type => wrap` perfectly works with `logger_disk_log_h`.  
Maybe it’s just me not fully understanding Logger.

---

<div class="post-metadata">

**Author:** ![garazdawi](https://erlangforums.com/user_avatar/erlangforums.com/garazdawi/32/175_2.png) [@garazdawi](https://erlangforums.com/u/garazdawi)\
**Post date:** [August 26, 2024, 9:02am UTC](https://erlangforums.com/t/logger-and-how-to-specify-level/3933/6 "2024-08-26T09:02:52Z")

</div>

A `wrap log` is a [disk\_log](https://www.erlang.org/doc/apps/kernel/disk_log.html) concept which is why that type does not exist in the standard handler.

There is a list of all the parameters that the different built-in logger handlers take in the respective documentation:

- [logger\_std\_h — kernel v10.0.1](https://www.erlang.org/doc/apps/kernel/logger_std_h.html)
- [logger\_disk\_log\_h — kernel v10.0.1](https://www.erlang.org/doc/apps/kernel/logger_disk_log_h.html)

---

<div class="post-metadata">

**Author:** ![zabrane](https://erlangforums.com/letter_avatar_proxy/v4/letter/z/7ba0ec/32.png) [@zabrane](https://erlangforums.com/u/zabrane)\
**Post date:** [August 26, 2024, 9:08am UTC](https://erlangforums.com/t/logger-and-how-to-specify-level/3933/7 "2024-08-26T09:08:06Z")

</div>

@garazdawi I better see now. Last question please.

Is this possible to create a Logger for one particular task?

Let me explain. I’d like to log all messages related to `FTP` into `/var/lib/sftp.log`.  
I’ve an secure FTP server where customers deposit files. Every time a file is processed, I’d like to log a message into `/var/lib/sftp.log` using Logger.

---

<div class="post-metadata">

**Author:** ![garazdawi](https://erlangforums.com/user_avatar/erlangforums.com/garazdawi/32/175_2.png) [@garazdawi](https://erlangforums.com/u/garazdawi)\
**Post date:** [August 26, 2024, 9:18am UTC](https://erlangforums.com/t/logger-and-how-to-specify-level/3933/8 "2024-08-26T09:18:45Z")

</div>

There are many ways to achieve that, what I would do is to tag each log event from your ftp service with its own domain, like this:

```erlang
logger:info(#{ event => reading_file, file => Filename }, #{ domain => [zabrane, ftp] }).

```

and then setup a new backend with a filter that only includes that domain:

```erlang
logger:add_handler(ftp_logger, logger_std_h,
      #{ config => #{ file => "/var/log/sftp"},
         filters => [{ftp_domain, {fun logger_filters:domain/2,
                                   {stop, not_equal, [zabrane, ftp]}}}]}).

```

or doing it in sys.config:

```erlang
{handler, ftp_logger, logger_std_h,
      #{ config => #{ file => "/var/log/sftp"},
         filters => [{ftp_domain, {fun logger_filters:domain/2,
                                   {stop, not_equal, [zabrane, ftp]}}}]}}

```

---

<div class="post-metadata">

**Author:** ![zabrane](https://erlangforums.com/letter_avatar_proxy/v4/letter/z/7ba0ec/32.png) [@zabrane](https://erlangforums.com/u/zabrane)\
**Post date:** [August 26, 2024, 9:19am UTC](https://erlangforums.com/t/logger-and-how-to-specify-level/3933/9 "2024-08-26T09:19:38Z")

</div>

@garazdawi you made my day 🙏

---

<div class="post-metadata">

**Author:** ![zabrane](https://erlangforums.com/letter_avatar_proxy/v4/letter/z/7ba0ec/32.png) [@zabrane](https://erlangforums.com/u/zabrane)\
**Post date:** [August 26, 2024, 11:40am UTC](https://erlangforums.com/t/logger-and-how-to-specify-level/3933/10 "2024-08-26T11:40:26Z")

</div>

@garazdawi I’ve noticed that calling the following always returns `ok`. Nothing is printed in the console:

```erlang
> logger:info("hello ftp", #{ domain => [zabrane, ftp] }).
ok

```

Is this an expected behaviour?  
How to allow printing thing in the console as well?

---

<div class="post-metadata">

**Author:** ![garazdawi](https://erlangforums.com/user_avatar/erlangforums.com/garazdawi/32/175_2.png) [@garazdawi](https://erlangforums.com/u/garazdawi)\
**Post date:** [August 26, 2024, 11:46am UTC](https://erlangforums.com/t/logger-and-how-to-specify-level/3933/11 "2024-08-26T11:46:58Z")

</div>

The default logger handler only logs messages that don’t have a domain or that are part of the `otp` domain. So you will have to add a filter that adds logging of your domain. You can do that like this:

```erlang
logger:add_handler_filter(default, ftp_domain,
            {ftp_domain, {fun logger_filters:domain/2,
                          {log, equal, [zabrane, ftp]}}}).

```

---

<div class="post-metadata">

**Author:** ![zabrane](https://erlangforums.com/letter_avatar_proxy/v4/letter/z/7ba0ec/32.png) [@zabrane](https://erlangforums.com/u/zabrane)\
**Post date:** [August 26, 2024, 1:39pm UTC](https://erlangforums.com/t/logger-and-how-to-specify-level/3933/12 "2024-08-26T13:39:02Z")

</div>

> [@garazdawi](#):
>
> `logger:add_handler_filter`

@garazdawi Indeed. This worked:

```erlang
    logger:add_handler_filter(default, ftp_domain,
      {fun logger_filters:domain/2, {log, equal, [zabrane, ftp]}}),

```
