Erlang の logger の謎が見えてきた

Erlang で書かれたアプリケーションの logger 。使っていると色々と疑問がわいてくる。
今思いつくだけでも

  • error_logger という名前なのに設定で sasl とか log_mf_h など違う名前が出てくるの?
  • error_logger の吐くログはなぜ rb で見るの?面倒だよね。
  • 数々のプロジェクトが独自 logger を実装しているのはなぜ?

など。

背景

error_logger は event manager として実装されている。ロギングは error_logger に登録された event handler が行う。
これが分かればあとは簡単。

  • デフォルトの event handler はログを tty に出力するだけ
  • 起動中に Kernel Application が上記 handler を standard event handler に置き換える。同様に tty に出力。
    • Kernel の設定でファイルにログを出力する事も可能。disk_log モジュール。
    • ファイルへの出力はバイナリ 形式
  • SASL Application がユーザーによって start されていれば、SASL は独自の event handler を登録する
    • デフォルトでは supervisor の crash/progress を tty に出力
    • sasl_report_tty_h, sasl_report_file_h, error_logger_mf_h
  • ユーザーは独自の event handler でログを記録する事も可能。
    • 複数のファイルをローテートして出力する log_mf_h という event handler が利用可能。(SASL の error_logger_mf_h もこれを利用している)
    • ファイルへの出力はバイナリ 形式

疑問への答え

  • error_logger という名前なのに設定で sasl とか log_mf_h など違う名前が出てくるの?
    • それぞれ event handler 名。
  • error_logger の吐くログはなぜ rb で見るの?面倒だよね。
    • 速度を考慮してバイナリ形式で吐かれるから。
  • 数々のプロジェクトが独自 logger を実装しているのはなぜ?
    • バイナリ形式だとユーザーに優しくないから?

バイナリ形式やめたい

テキスト形式の log_mf_h ないの?
あるよ。でも最新の OTP では動かないかも。(-include_lib("kernel/src/disk_log.hrl").とか書いてあるし)。→ビルドできた→動いた。