Dockerコンテナ内の複数のログを/var/log/messagesに転送する方法
Dockerのログ転送
はじめに
Dockerでは logging Driverを使用することで、コンテナ内のプロセス(PID1)のログを転送することが出来ます。今回は特にsyslog
による転送がテーマです
1コンテナ1プロセスがDocker公式の推奨ですが、アプリやDBだけではなく、監視やメールなど、コンテナに役割をもたせ複数のプロセスを起動するケースも往々にして存在します。
そんな時、複数のプロセスがバラバラのログを吐くことになりますが、これをまとめてホストOSの/var/log/messages
に転送したいというときに使えるテクニックです。
割りと力技ですので、よりよいアイデアがあれば教えていただけると助かります。
どう実現するのか
Dockerのlogging driver はコンテナ内プロセスPID(1)の標準出力を転送しています。(/proc/1/fd/1
)
ですので、コンテナ内でtail -F [ログ名]...[ログ名] > /proc/1/fd/1 &
プロセスを立ち上げてやることで、複数のログをPID(1)のプロセスの標準出力に飛ばしてやります。
実際のソース
イメージですがこんな感じなります。
FROM apache
ENTRYPOINT ["sh","-c","/start_apache.sh"]
tail -F aaa.log bbb.log ccc.log 2 > /dev/null 1 > /proc/1/fd/1 &
exec /usr/sbin/apachectl -DFOREGROUND -k start
docker run -d --log-driver=syslog --log-opt image_name
ログローテートへの対応もできる!
コンテナ内のログが肥大化してしまうためログ自体を外出するのが普通です。しかし訳あって出来ない場合は(Dockerコンテナのログをローテートする - Qiita)で紹介したテクニックでローテートすることが出来ます。
この時ログがローテートされると、tail が途切れてしまうと思われますが、賢いtail に -F をつけると、同じログ名であればローテート後も監視を続けてくれる動きをします。
オプション | 説明 |
---|---|
-F | --follow=name --retry と等価である。 |
-f, --follow | ファイルの内容が増え続ける時、追加されたデータを出力する; -f,--follow と --follow=descriptor は等価である。 |
--retry | ファイルがアクセスできない、あるいはアクセスできなくなろうとしていたとしても、ファイルのオープンを繰り返す; --follow=name で名前で追跡している場合に有用である。 |
Author And Source
この問題について(Dockerコンテナ内の複数のログを/var/log/messagesに転送する方法), 我々は、より多くの情報をここで見つけました https://qiita.com/Gin/items/c340279f51c94f8af92c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .