i remember nothing

文章の練習も兼ねています

Elixir の Logger をカスタマイズするプラグイン Loggix を作った

作った。

github.com

機能

  • ログのパスの指定
    • Erlang のログは普通は /var/app/logs/xxx.log に置かれるがこれを config/config.exs でよしなに指定できる
  • ログレベルの指定
  • ログレベルによってパスを振り分けたりできる。
  • ログローテの設定
    • 1ファイルの max_byte の指定
    • ローテするにあたってログファイルを何個作成するかの指定
  • ログフォーマットの指定
    • format: “$time $metadata [$level] $message” などとすることでログのフォーマット形式を自由に変更できる
  • メタデータの指定

    • metadata: [:user_id, :is_auth] などと指定して、 Logger.info("hoge", [user_id: "xxx-xxx", is_auth: true]) というふうに出力すると、format に合わせてログデータを出力できる。
  • JSON Encoding 機能

    • json_encoder を Poison, JSON などに指定することで好きなエンコーダでログをJSON形式で保存できる。
    • 上述のメタデータにも対応。 {"time": "0000-00-00 00:00:00.000", "level": "info", "message": "hoge", "user_id": "xxx-xxx"} のような形で出力される。
  • UTF-8 対応

課題

  • :gen_event を使っていて、ログが詰まるとプロセスが死んで死ぬ。死んでも再起動するが、死ぬ前にキューに詰まったログは破棄されてしまう。
    • 実際プロセスを 100000 sec ほど寝かせて log を出力しまくったら死んだ
  • 最高の OTP 設計を知りたい