docker logs [container-name]
特定のコンテナのログを確認するために使用します。
これらのログをクリアするエレガントな方法はありますか?
ベストアンサー1
まず悪い答えから。この質問実行できるワンライナーがあります:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
echo の代わりに、もっとシンプルなものがあります:
: > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
または、truncate コマンドもあります:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
私はどちらもあまり好きではありません。なぜなら、これらはDockerのファイルを直接変更するからです。外部ログの削除は、DockerがJSON形式のデータをファイルに書き込んでいる間に発生する可能性があり、その結果、行の一部が削除され、docker logs
CLIからログを読み込む機能が失われます。その例については、以下を参照してください。duketwoの回答に対するこのコメント:
ログファイルを空にした後、次のエラーが発生します:
error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
代わりに、Dockerが自動的にログをローテーションするようにすることができます。これは、デフォルトのdockerdを使用している場合は、dockerdに追加のフラグを設定することで実行されます。JSON ロギング ドライバー:
dockerd ... --log-opt max-size=10m --log-opt max-file=3
これをあなたのデーモン.json起動スクリプトを変更する代わりに、ファイルを変更します。
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
これらのオプションは、ルート アクセスで設定する必要があります。このファイルを変更した後、設定を適用するには、必ず を実行してくださいsystemctl reload docker
。この設定は、新しく作成されたコンテナーのデフォルトになります。新しいログ制限を受け取るには、既存のコンテナーを削除して再作成する必要があることに注意してください。
同様のログ オプションを個々のコンテナに渡してこれらのデフォルトを上書きし、個々のコンテナに保存するログの数を増やすか減らすことができます。docker run
これは次のようになります。
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
または作成ファイル内:
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
さらにスペースを節約するには、json ログ ドライバーから「ローカル」ログ ドライバーに切り替えることができます。同じ max-size および max-file オプションを使用しますが、json に保存する代わりに、より高速で小さいバイナリ構文を使用します。これにより、同じサイズのファイルにさらに多くのログを保存できます。そのための daemon.json エントリは次のようになります。
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
ローカル ドライバーの欠点は、JSON ログへの直接アクセスに依存する外部ログ パーサー/フォワーダーが機能しなくなることです。そのため、Elastic に送信するために filebeat などのツールや Splunk のユニバーサル フォワーダーを使用する場合は、「ローカル」ドライバーは使用しないでください。
これについては私のヒントとコツのプレゼンテーション。