dockerコンテナにつなげている場合、コンテナから出てくるログに対してパイプをつなげたいということが度々生じるが、実現するのにかなり苦労したので、備忘録として残しておく
grepでパイプラインさせる
コンテナログから最新のログを出し、垂れ流したい場合はこのようにします。-f
のみだと全部出てくるため、--tail
オプションも併用しています。
※ 出力したいコンテナ名をcontainer_name
としています。
docker logs container_name -f --tail 1
これをgrep
でパイプラインさせる場合は、以下のことに注意する必要があります。
- docker logsのログは
STDOUT
およびSTDERR
双方に出力されることがあるため、|&
でパイプラインさせる -
grep
では出力がバッファされてしまうので、--line-buffered
オプションもつけてバッファさせないようにしておく(ここでさんざんハマりました)
したがって、このようにすればgrep
でパイプラインできるようになります。
docker logs container_name -f --tail 1 |& grep --line-buffered [ここに絞り込みたい条件を記載]
さらにjqでパイプラインさせる
docker logsの結果にjsonで流し込んでいる場合は、jqでパイプラインさせたいときがあります。
その場合は、以下のことに注意する必要があります。
- jsonの部分を取り出したいので、grepで抽出させる。もちろんバッファされないようにするため、
--line-buffered
も併用しておく - その結果をjqに入れるが、バッファさせないようにするため
--unbuffered
オプションをつけておく
したがって、このようにすればjq
でパイプラインできるようになります。
docker logs container_name -f --tail 1 |& grep --line-buffered -io '{.*}' | jq --unbuffered '.'