Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

Syslogフォーマット文字列のパーサ/シリアライザを作成した

なんかしらの状況を把握・記録するために、適当にログをはいておくことがあると思います。その際、いろんなフォーマットがあり得ますが、別にSyslogに吐きたいわけではないけれど、Syslogのフォーマットに合わせておけば、変なオレオレフォーマットよりは後々便利なんじゃないかなーと思ったりしたので作りました。

Syslogのログフォーマットは、RFC 5424に仕様があったりします。また、その仕様で導入されたStructured Dataを使って、以下の資料のように、いい感じに構造化されたログを考えようという取り組みもなされています。

上記のモジュールは、そういうことを簡単に行えるためのものです。以下のことをします。

  • データ構造をその仕様に沿って、Syslogフォーマットな文字列にシリアライズ
  • Syslogフォーマットな文字列をデータ構造に復帰

ということをします。とはいえ、Structured Dataを使いたいだけなので、そこだけ実装しました。こんな感じ。

my $data = {
    foo => {
        bar => 'baz',
        qux => 'quux',
    },
    hoge => {
        piyo   => 'fuga',
        hogera => 'hogehoge',
    }
};

# データ構造をSyslogのStructured Dataフォーマットな文字列にする
my $string = Syslog::MessageFormat::RFC5424::StructuredData->to_string($data);

is($string, '[foo bar="baz" qux="quux"][hoge piyo="fuga" hogera="hogehoge"]');

# 上記の文字列をパースして、データ構造に復帰する
is_deeply(Syslog::MessageFormat::RFC5424::StructuredData->parse($string), $data);

とりあえずなんか適当にログを吐く時にこれを使えば、あとから集計したいというような時などに役立つのかなーと思ったりしています。