[Elixir]Loggerのconsole出力をファイルに書き出すではlogger_file_backendを使う、ところを残しました。そのついでに、CustomLogger付近とその作り方を見てみました。
参考:
これを理解するために、ElixirのLoggerの実装群や、 GenEvent 付近が理解を助けてくれます。
- https://github.com/elixir-lang/elixir/tree/v1.2.0/lib/logger/lib
- Elixir本体のloggerの参考
- https://github.com/elixir-lang/elixir/blob/v1.2.0/lib/logger/lib/logger/backends/console.ex
:consoleのbackendの書き方の参考- このようにしてcustomer loggerを作り、backendとして指定、利用できる
- https://github.com/elixir-lang/elixir/blob/v1.2.0/lib/logger/lib/logger/formatter.ex
- log levelの種類によって表示を整形する参考
- https://github.com/elixir-lang/elixir/blob/v1.2.0/lib/elixir/lib/gen_event.ex
- Backendの拡張のために利用される
私も参考で貼ったスライドを参考に、練習のためにCustomLoggerを書いてみました。consoleの実装箇所を参考にすればここら辺もかける感じ。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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/3 や File.close/1 を使ってファイルに書き出したりしているのですね。
https://github.com/onkel-dirtus/logger_file_backend/blob/master/lib/logger_file_backend.ex
なるほど。学び。