[Elixir]CustomLoggerのコードを追う

[Elixir]Loggerのconsole出力をファイルに書き出すではlogger_file_backendを使う、ところを残しました。そのついでに、CustomLogger付近とその作り方を見てみました。

参考:

これを理解するために、ElixirのLoggerの実装群や、 GenEvent 付近が理解を助けてくれます。

私も参考で貼ったスライドを参考に、練習のためにCustomLoggerを書いてみました。consoleの実装箇所を参考にすればここら辺もかける感じ。


defmodule MyLogger do
use GenEvent
def init(__MODULE__), do: init({:user, []})
def init({device, _opts}) do
config = Application.get_env :logger, :my_logger, []
format = Keyword.get(config, :format) |> Logger.Formatter.compile
level = Keyword.get config, :level, :info
metadata = Keyword.get config, :metadata, []
{:ok, %{format: format, metadata: metadata, level: level, colors: %{}, device: device}}
end
def handle_call({:configure, _options}, state), do: {:ok, :ok, state}
def handle_event({_level, gl, _event}, state) when node(gl) != node(), do: {:ok, state}
def handle_event({level, _gl, {Logger, msg, _ts, _md}}, state) do
IO.inspect [level, msg]
{:ok, state}
end
end

このように書くことで、Phoenix上でも利用することができます。

config :logger,
format: "$time $metadata[$level] $message\n",
metadata: [:request_id],
backends: [MyLogger]

実行したら、こんな感じのログがコンソールに表示されます。

[:info, "Running WebQaVote.Endpoint with Cowboy using http on port 4000"]

ここまで見てlogger_file_backendを見てみると、その違いはログを File.open/3File.close/1 を使ってファイルに書き出したりしているのですね。

https://github.com/onkel-dirtus/logger_file_backend/blob/master/lib/logger_file_backend.ex

なるほど。学び。

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.