FreeRadiusとlogとtimestamp

FreeRadius のログをファイルに保存するようにしていると、ログに追加されるtimestamp が ctime の形式になっていて、変更ができません。

手元で試していたのはCentOS6系だったので FreeRadius2.xなのですが、確認したところ、3.x, 4.x ともに変化は無いようでした。

freeradius-server/log.c at v2.x.x · FreeRADIUS/freeradius-server · GitHub

freeradius-server/log.c at v3.0.x · FreeRADIUS/freeradius-server · GitHub

freeradius-server/log.c at v4.0.x · FreeRADIUS/freeradius-server · GitHub

Users - Add timestamp with milliseconds in Radius Log

そもそもなんでこんなことを気にしたのかというと、

Elasticsearch にログを入れたい。 できれば syslogを経由したくない。

ということで、 FileBeat でElasticsearchに入れようと思いました。

この場合、FileBeatがログファイルを定期的に見に行って、ログが追加されていればそれをElasticsearchに送信するという仕組みです。

そのため、ログが書かれた時間ではなくFileBeatがログをElasticsearchに投げた時間が@timestampとして記録されてしまいます。

たまたま接続が不安定で再送した時など、再送した時間が@timestampになってしまって、若干扱いにくいところがあります。

ではどうするか、というところで、Elasticsearchにpipelineというプロセッサがあることを教えてもらえました。

Logstashなどがやっているようなフォーマット変換などをElasticearchで簡易にやれるものです。これを使ってtimestamp変換をかけてみたのですが、フォーマットに関してろくに調べなかったのでハマったというお話です。

ctime では

Thu May 24 02:19:49 2018

というような形式なのですが、Hourが02という形式になっているので、日も01とかになるか?と思っていたら

Thu May  4 02:19:49 2018

というように、日はスペースで埋められます。 そのため時間の形式として

"formats":["MMM d HH:mm:ss yyyy","MMM  d HH:mm:ss yyyy"]

と2タイプ用意しておく必要がありました。

ctimeをパースするときは気をつけましょう。

ちなみに、 syslogを経由すると syslog側でtimestampの形式を柔軟に出来るので、こんな手間はいりません。