2013年11月27日水曜日

rsyslogdで秒よりも細粒度の時間を記録する

rsyslogdは、最近のLinuxディストリビューションだと標準でインストールされているsyslogデーモンです。syslogdを拡張したものとしては、rsyslogdやsyslog-ngがありますが、syslog-ngは、ポリシがsyslogdと互換性がないなど、やや運用には手間がかかります。まあ、syslogdのポリシをsyslog-ngのポリシに変換するツールは確かsyslog-ngの中の人が提供してくれていたような気もしますが、私は標準でインストールされているrsyslogdを使っています。

rsyslogdになって何が拡張されているかというと、TCPを用いてリモートマシン上のrsyslogdにログを転送できます。syslogdでは、ログの転送にはUDP/514を用いますが、rsyslogdからはTCP/514を用いてログを転送できます。UDPの方が少しレイテンシは良いですが、高負荷な環境でないのならTCPを用いるのがベターでしょう。

で、rsyslogdによるログの転送速度を測定したかったのですが、rsyslogdで標準で記録できるタイムスタンプは、最も細かくても秒単位です。1,000回ログを転送したとしても1秒かからないので、このままでは、測定になりません。rsyslogdのソースコードをもってきて、ログの送信時間を秒よりも細粒度の単位でログメッセージに含めたり、複数回のログの受信時間を測定して、その時間を受信したログの数で割ったりしようとしましたが、ソースコードを書き換えるのは少し抵抗があります。性能を測定したいのに、ソースコードに手を加えるのはどうなの?という点です。

そこで、色々調べたところ、rsyslogdは、ログメッセージの形式をポリシで設定できるようです。そこで、より細粒度にタイムスタンプを記録できないかと調べたところ、%timegenerated%なるパラメータがありました。さすがですね。ただ、%timegenerated%と書いただけでは、標準のタイムスタンプと形式が変わりません。より細粒度な時間を記録するには、%timegenerated:::date-rfc3339%と書きます。rfc3339はインターネットにおける時間の取り扱いに関するRFCです。時間に関するパラメータとしては%timereported%もありますが、これは、受信したログに含まれる情報をもとにしてタイムスタンプを記録します。一方、%timegenerated%は、送信側がログを生成した時間を推測するようで、こちらの方が高精度です。ちなみに、timegeneratedとdate-rfc3339の間にあるコロンは、rsyslogにおけるフィルタに関係します。rsyslogでは、ログメッセージにフィルタを適用して指定した箇所だけをログに記録できます。コロンはログの開始位置と終了位置を指定するたのもので、%msg:1:2%と書いた場合は、%msg%のうち、1文字目から開始して2文字目までの範囲だけをログに記録します。このフォーマットではコロンは省略できないので、文字列を全部記録したいけどオプションも指定したい場合には、コロンが三つ並ぶ形になります。

高精度にタイムスタンプを記録するにはオプションを指定すれば良いことが分かりました。ここで気になるのは、どういったオプションがあるのかです。オプションの種類については、rsyslogのソースコードのdoc/property_replacer.htmlに書いてあります。タイムスタンプに関係するオプションとしては、date-mysql, date-rfc3164, date-rfc3164-buggyday, date-rfc3339, date-subsecondsが用意されています(2013/11/27現在)。それぞれ、以下のような形式で出力されます。

  • date-mysql: 20131127211715
  • date-rfc3164: Nov 27 21:17:15
  • date-rfc3164-buggyday: Nov 27 21:17:15
  • date-rfc3339: 2013-11-27T21:17:15.425969+09:00
  • date-subseconds: 425969

それぞれの詳細はドキュメントを参照していただきたいですが、秒未満を見たいだけならdate-subsecondsだけでも良いのですが、すべての時間を含む表示が得られるdate-rfc3339がもっとも詳細に多くの情報を取得できます。

しかし、ただログを受信して保存するだけのデーモンなrsyslogdですが、実は多機能でドキュメントもかなり充実しています。以外に便利なので、少し勉強してみてはどうでしょうか。ソースに同梱されているドキュメントが詳細でお勧めです。


0 件のコメント:

コメントを投稿