# Structured (JSON) logs in Erlang

**URL:** <https://erlangforums.com/t/structured-json-logs-in-erlang/4741>\
**Category:** Questions / Help\
**Tags:** erlang-logger\
**Created:** [May 8, 2025, 8:02pm UTC](https://erlangforums.com/t/structured-json-logs-in-erlang/4741 "2025-05-08T20:02:43Z")\
**Posts on this page:** 6\
**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:** [May 8, 2025, 8:02pm UTC](https://erlangforums.com/t/structured-json-logs-in-erlang/4741/1 "2025-05-08T20:02:43Z")

</div>

Hi All

I’d like to get structured logging in my Erlang app.

I found this very nice article about the concept for Elixit:  
[Structured (JSON) logs in Elixir](https://dev.to/aymanosman/structured-json-logs-in-elixir-48gi)

Are there examples I can learn from?

Many thanks  
/Zab

---

<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:** [May 8, 2025, 8:23pm UTC](https://erlangforums.com/t/structured-json-logs-in-erlang/4741/2 "2025-05-08T20:23:31Z")

</div>

There’s this one for Erlang:

> **[GitHub - cogini/logger\_formatter\_json: Erlang OTP logger formatter that outputs JSON](https://github.com/cogini/logger_formatter_json/)**
>
> Erlang OTP logger formatter that outputs JSON

---

<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:** [May 9, 2025, 6:12am UTC](https://erlangforums.com/t/structured-json-logs-in-erlang/4741/3 "2025-05-09T06:12:30Z")

</div>

[logger\_formatter\_json](https://github.com/cogini/logger_formatter_json) did the job:

```erlang
[
 {kernel, [
    {logger, [
        {handler, default, logger_std_h,
         #{formatter => {logger_formatter_json, #{}}}
        }
    ]},
    {logger_level, info}
 ]}
].

```

The only downside is that it depends on [thoas](https://github.com/lpil/thoas).

---

<div class="post-metadata">

**Author:** ![mworrell](https://erlangforums.com/user_avatar/erlangforums.com/mworrell/32/267_2.png) [@mworrell](https://erlangforums.com/u/mworrell)\
**Post date:** [May 9, 2025, 6:23am UTC](https://erlangforums.com/t/structured-json-logs-in-erlang/4741/4 "2025-05-09T06:23:02Z")

</div>

We also have this logger, which we are using in production:

> **[logstasher](https://hex.pm/packages/logstasher)**
>
> The logstasher is Erlang Logger formatter for logstash

And its git repo:

> **[GitHub - zotonic/logstasher: Erlang Logger formatter for logstash](https://github.com/zotonic/logstasher)**
>
> Erlang Logger formatter for logstash

---

<div class="post-metadata">

**Author:** ![maxlapshin](https://erlangforums.com/user_avatar/erlangforums.com/maxlapshin/32/1593_2.png) [@maxlapshin](https://erlangforums.com/u/maxlapshin)\
**Post date:** [May 14, 2025, 12:02pm UTC](https://erlangforums.com/t/structured-json-logs-in-erlang/4741/5 "2025-05-14T12:02:22Z")

</div>

I have an OpenAPI schema: [Flussonic Media Server API](https://flussonic.com/doc/api/reference/#tag/events/operation/available_events_list/response%7Cevents__0%7Cevent)

this schema declared an API endpoint that gives some list of events, but all these events can be emitted in the JSON push webhooks and they are logged in the logger. It is one event subsystem inside whole server.

Each event has its structure and I’ve made a code generator that translates this openapi to erlang typespec for dialyzer to be happy.

One command line option change the output mode of logger from “admin style” to “devops style” and flussonic will output json newline delimited logs with the structure declared in former api.

It is really convenient.

---

<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:** [May 15, 2025, 7:38am UTC](https://erlangforums.com/t/structured-json-logs-in-erlang/4741/6 "2025-05-15T07:38:05Z")

</div>

> [@maxlapshin](#):
>
> I have an OpenAPI schema: [Flussonic Media Server API](https://flussonic.com/doc/api/reference/#tag/events/operation/available_events_list/response%7Cevents__0%7Cevent)

Wow, it looks great.
