kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

ファイルが作成されたら自動追尾するfluent-agent-chimeraを作りました

特定のディレクトリ配下に、任意のタイミングでディレクトリが新規作成されて、その配下にログが出力されているような状況下で、そのログをin_tailで取り込みたいという必要性から、fluent-agent-chimera

github.com

を作りました。

目次

どういうものか

例えば

/path/to/batchdir
  - dir1
    - hoge_20180201.log
    - hoge_20180202.log
    - xxxx_20180201
    - yyyy.log
  - dir2
    - hoge_20180201.log

というディレクトリ、ファイルがあるとします。

これに対して、設定ファイルとして以下のようなものを用意します。

[Server]
Network = "tcp"
Address = "127.0.0.1:24224"

[[Logs]]
Tag = "batch"
Basedir = "/path/to/batchdir"
Recursive = true

TargetFileRegexp = "^.+/batchdir/.*(\\d{8})(?:.*\\.log)?$"
FileTimeFormat = "20060102"

この設定でfluent-agent-chimeraを起動すると、まず

/path/to/batchdir
  - dir1
    - hoge_20180202.log
    - xxxx_20180201
  - dir2
    - hoge_20180201.log

のファイルが監視対象となり、ログが出力されると指定のfluentサーバにログがforwardされます。

ここで

/path/to/batchdir/dir1/hoge_20180203.log

というファイルが作成されると、dir1/hoge_20180202.log は監視対象からはずれ、dir1/hoge_20180203.log が監視対象となります。

さらに

/path/to/batchdir/dir3/hoge_20180202.log

が作成されれば、このファイルも新たに監視対象となります。

このように、監視対象のディレクトリと、正規表現にマッチするファイル(ただし、ファイル名に日付を含むファイル)を新規に作成されるものも含めて自動追尾して、fluentサーバにログをforwardしてくれるのが、fluent-agent-chimeraです。

まぁ、アプリとかバッチのログ出力をちゃんと最初から設計して、普通にfluentやfluent-agent-hydraなどで追えるようにしおけばこんなものは不要なのですが、いろいろ事情もあるわけで(つらい)、こんな闇のようなツールを生み出しました。

実装について

GitHubリポジトリにも書いていますが、fluent-agent-chimeraは、@fujiwara さんの

github.com

です。基本的な構成は同じで、inotifyでの処理部分を作り込みつつ、in_forwardを削ったり、ファイルの中身を処理するところ削ったりしています。

fluent-agent-chimeraは、基本的に新規作成ファイルの検知がメインで、あとはなるべくローカルのfluentに処理を移譲する、という想定でいます。

あとは、fluentのclientとして、@lestrrat さんの

github.com

に変更しまいた。fluent-agent-hydraを大きく書き換えているので、fluentのclient部分をfluent-agent-hydraに組み込まれているfluent clientに依存させると、それに追随するのも手間かなと思ったのと、単にいじってみたかったので、変えました。そのおかげで、unix domain socketでfluentサーバと通信も可能です。

そのほか

今回、初めてGoのソースを公開するってのをしたのですが、一連の公開の手順については、@songmu さんの

github.com

を多いに参考にさせてもらいました。

goxz 含めて、gobump, ghr, ghch などが見事に連携されていて、このやり方が標準になれば良いのでは、と個人的には思ったほどです。多分、今後もこれにならう感じになりそうです。

最後に

個人的には、やっぱりGoは肌にあっているなぁという感じです。もっとGoを書いていきたい。

で、もし感想とかありましたら、@takakiku までいただけると嬉しいかもです。