Logging from IEx to application standard output

I have an Elixir application running in a kubernetes pod, it uses LoggerJSON to send JSON formatted logs to standard output - that works fine.

When I use kubectl exec to access that pod and run bin/my_app remote the IEx session sends logs to the container standard output about typos that I’ve made etc, but if I require Logger and then Logger.error("Hello from IEx"), that appears in the IEx console but does not go to the container standard output.

Task.async(fn -> Logger.error("Hello from IEx") end) goes to the IEx console.

Task.Supervisor.async_nolink(MyTaskSupervisor, fn -> Logger.error("Hello from IEx") end) goes to the container stdout.

How does one direct logs created from IEx to the application logger?

Using Task.Supervisor.async_nolink/2 is my workaround to experiment with creating logs and seeing how they look at the other end of log processing, but it would be nice to understand more about how standard_io and logging is handled and propagrated through the system.

The thing is, that newly spawned processes will inherit group leader from their parent. Group leader is a process, that handles IO for all processes connected to it. By default log events coming from processes with different group leader are rejected, as it is assumed by the system, that they want to see messages themselves instead of sending them to remote node.

4 Likes

A working link for group_leader.

2 Likes