Lager を使ってみた

概要

Lager というのは Riak の Basho が開発したロギングツールです。

https://github.com/basho/lager

そもそも Erlang にはロギングモジュールは付随しているのですが、あからさまに使いにくいのです ... 。

特徴

Lager ですがかなり柔軟に出来ています。

  • ログレベル指定でのログ出力
    • debug, info, notice, warning, error, critical, alert, emergency
  • parse_transform を使って module や function 等の情報もログできます
  • ログの出力先を簡単に拡張出来ます
    • gen_event ベースで書かれているので拡張するのは結構簡単です
  • ログローテーションが出来ます
    • $D23 とかくと、毎日 23:00 で切り替えるとか

シンプルではありますが、かゆいところには手が届きます。ロガー作ったことある人はわかると思うんですが、ロガーって作るのほんっと大変なんですよね ... 。

さらに Riak 1.1 のリリースノートを読むと Lager は io:format/2 より 4 倍速いらしいです。

https://github.com/basho/riak/blob/master/RELEASE-NOTES.org

  • Term printing is ~4x faster and much more correct (compared to io:format)
  • Bitstring printing support was added

あと binary 情報をそのまま文字列として出力してくれます。

拡張としては syslog と amqp に対応しています。AMQP は RabbitMQ が前提っぽいです。

使ってみる

まず R15B でテストまで回すと盛大にこけます。理由は line number 前提でテストが書かれていないからです。 テストは通りませんが、動くので気にしないことにしましょう。

基本的な使い方です。application:start/1 については *.app.src に登録してもいいです。

  • rebar.config に lager を追加する
  • application:start(lager) する
  • lager:info("spam!spam!spam!", [])
デフォルト

設定が無ければ何もしなくて良いです。デフォルトの Lager 設定が使われます。

設定の指定

設定がいくつかあるのでその設定を指定する場合は start するまえに application:load/1 してから set_env して start するようにしましょう。

設定は handlers とクラッシュログについてです。クラッシュログ関連はデフォルトで良いので、あとは handlers を登録しましょう。

サンプル

application:set_env(lager, handlers, [
      %% コンソール出力出力バックエンド
      {lager_console_backend, info},
      %% ファイル出力バックエンド
      {lager_file_backend, [
        {"error.log", error, 10485760, "$D0", 5},
        {"console.log", info, 10485760, "$D0", 5}
      ]}
    ])

役に立たないサンプルコード

出力例をとるために、サンプルを書きました。

ただ、正直シンプルなのでほとんど参考にはならないと思います。

https://github.com/voluntas/snowflake/tree/feature/lager

Eshell V5.9  (abort with ^G)
1> application:start(lager).
ok
00:28:52.054 [info] Application lager started on node nonode@nohost
2> application:start(snowflake).
00:28:56.715 [error] spam!spam!spam!
00:28:56.719 [info] abcdefg
ok
00:28:56.720 [info] Application snowflake started on node nonode@nohost

感想

今までロギング周りは時前で書いてたりしたのですが、今後は Lager 使ってもイイかなと思いました。

これから、アプリ書く人でイベントログをちゃんと取りたい人にはとてもお勧めできるロギングアプリだと思います。

ただ、出力がイベント周り限定なので、個人的にはもう少し汎用的なのが欲しいなぁと思うところなので、Lager を参考にしつつ自分で書くしかないなと。 もちろん 4 倍速いあたりはそのまま使いたいと思います。

参考

4 倍速い実装がされているっぽい所 io_lib_format の fork して書き換えているっぽい
https://github.com/basho/lager/blob/master/src/lager_format.erl