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").とか書いてあるし)。→ビルドできた→動いた。