2016-05-10 5 views
1

私は/ var/lib/docker/containersディレクトリをマウントし、各コンテナのすべてのログを出力するfluentdコンテナを使用しています。ログは/var/lib/docker/containers/$container_id/$container_id-json.logに保存されます。これらには、コンテナ名またはイメージ名は含まれません。私は、ログファイルから来るすべてのログに別々のフィールドにコンテナとイメージ名を追加できるようにする必要があります。Dockerのロギングにfluentdを使用する場合、コンテナとイメージの名前を取得する方法は?

コンテナ名とイメージ名は、どちらも/var/lib/docker/container/$container_id/config.v2.jsonに格納されています。私はそのファイルからイメージと名前を取得し、それを対応するログにレコードとして追加する方法を理解できません。

これは私の最初の考えであり、これを行うにはより良い方法があるかもしれませんが、アドバイスを提供することは自由です。

サイドノート:これまでlogspoutを同様の方法で使用していたので、私は意図的にfluentdをドッキングロギングドライバとして使用していません。現在の目標は、同様の方法でlogspoutをfluentdに置き換えることです。ロギングドライバがこの情報をより簡単な方法で提供している場合は、後で切り替えることを検討します。

答えて

0

私は以前に流暢に使っていませんでしたので、ここでやや抽象的な回答のためにお詫び申し上げます。しかし.. .. http://docs.fluentd.org/をチェックしているのでしょうか?おそらく、ログにin_tailを使用していると思いますか?

path /path/to/file 
tag foo.* 

明らかfoo.path.to.file

私はあなたを思っていると、イベントをタグ:そこの例から、それはおそらく、ラ入力メッセージにファイルへのパスを取得したいと思いますように見えますおそらくhttp://docs.fluentd.org/articles/filter_record_transformerenable_rubyを使用できます。これでおそらくfoo.path.to.fileタグを処理して少しのルビーを使ってコンテナIDを抽出し、次にJSONファイルを解析するように見えますか?たとえば、以下のルビーのファイルでテストたとえば

foo.rbconfig.v2.jsonのようなものだった

tag = 'foo.var.lib.docker.containers.ID.ID-json.log' 
require 'json'; id = tag.split('.')[5]; puts JSON.parse(IO.read("/var/lib/docker/containers/#{id}/config.v2.json"))['image'] 

は:

{"image":"foo"} 

が印刷されます

foo 

Fluentdかもしれませんすでにあなたのためにjsonを含んでいるので、多分あなたはt彼はrequire 'json';ビット。その後、fluentd用語でこれを入れて、おそらくあなたは、あなたが生産伊勢このビットにしたいと思います

<filter> 
    enable_ruby 
    <record> 
    container ${tag.split('.')[5]} 
    image ${id = tag.split('.')[5]; JSON.parse(IO.read("/var/lib/docker/containers/#{id}/config.v2.json"))['image']} 
    </record> 
</filter> 

ようなものを使用することもできますが、おそらくそれは、仕事ができますか?

関連する問題