Compose: 機能:ログ履歴をクリアする機能

作成日 2015年03月09日  ·  145コメント  ·  ソース: docker/compose

もともとFigを使っていたので便利だと思っていた機能で、今ではComposeは、Composedで管理されているコンテナのログ履歴をクリアする機能になります。 長時間実行されている、または「おしゃべりな」コンテナは、多くのログノイズが発生する可能性があります。

次のようなコマンドで問題が解決すると思います。
$ docker-compose logs --clear [service]

arelogs kinenhancement

最も参考になるコメント

docker logs -c (clear) <container>は素晴らしいでしょう。

+1

全てのコメント145件

これはdockerデーモンでサポートされている機能ではないと思います。 APIドキュメントを見ると、唯一のオプションは、返されたログをコンテナごとの限られた行数に切り捨てることです。

https://docs.docker.com/reference/api/docker_remote_api_v1.17/#get -container-logs

:+1:この問題の場合。 私は実際にcomposeを使用して、Golang、Mongodb、nginxでWebサイトを開発しています...開始してから5日後、長いログがあり、心配になります。 コンテナを再起動するたびに、ログに多くの行が追加されます。
@dnephinあなたが解決策を与えるかどうか(私は理解していません:))、またはそれがapiで可能かどうかを確認することを提案するかどうかはわかりません。 英語が下手でごめんなさい。

Docker 1.6は、ロギングドライバーのサポートを追加します。https://github.com/docker/docker/pull/10568 (現在; JSON、syslog、および「none」)を参照してhttps://github.com/docker/docker/pull/11485

それを聞いてうれしいです、どうもありがとう:)

Docker 1.6のバックグラウンドとアップデートに感謝します-楽しみにしています!

docker logs -c (clear) <container>は素晴らしいでしょう。

+1

+1本当に重要

聖なる牛、私は最後まで数分の丸太をただ座っていました。 コンテナを絶えず再構築する必要がないので、これも本当にありがたいです。

+1

+1

+1

:+1:

+1

+2

+1

念のため、Docker1.8とdocker-compose1.4には、 https: //docs.docker.com/compose/yml/#log-driverとlog-optmax-sizeを使用してログサイズを制限する方法がすでに存在し

  log_driver: "json-file"
  log_opt:
    max-size: "100k"
    max-file: "20"

@dmageありがとう、まさに私が必要なもの。

+1000

+1はこれを愛するだろう

+1

@dmageソリューションは私たちにとって素晴らしい働きをします。 これを+1している他の人たち、彼が与えた解決策の何が問題になっていますか?

@ Rodeoclash-これの1つのユースケースは、新しい実行、つまりCIテスト実行のために特定のコンテナーセットを再利用することだと思います。 古いログは新しい実行とは無関係であるため、次のコマンドの前にclearすると、混乱が解消されます。

+1

+ 1、 @ rosskevinと同じ必要性

要約すると、次のようになります。

  • これは作成ファイルから実行できます(https://github.com/docker/compose/issues/1083#issuecomment-141936600を参照)
  • #265は、 logsコマンドからの出力を制限できることをカバーしています
  • #1756は再利用されたコンテナケースをカバーしています

すでにサポートされているか、他の問題で追跡されているため、これを閉じます。

なぜこれが閉鎖されたのかよくわかりません。 ログ履歴をどのようにクリアしますか?

私は追加します:

  log_opt:
    max-size: 50k

ログの長さを制限します。

彼らは本当にこれを追加する必要があります、それは不可欠です。 ログを制限することは良いことですが、ログをクリアするための簡単なコマンドが必要です。

docker logs -c <container>

何が得られますか?

ログサイズを制限する方法は理解していますが、ログをどのように_クリア_しますか?

ログのクリアは、ログを管理するDockerエンジンではサポートされていないと思います。

たぶんカスタムログドライバーでそれを行うことができますが、それは作成するために外部になります。

ログをフラッシュできるようにするための+1 ...

+1

+1

+1

+1

ログクリアコマンドの場合は+1。

ログクリアコマンドの場合は+1

+1

+1

+1

:+1:

+1

+1

そのドキュメントを見てください:
https://docs.docker.com/engine/admin/logging/overview/

docker-logs-clean.sh

#!/bin/bash

rm $(docker inspect $1 | grep -G '"LogPath": "*"' | sed -e 's/.*"LogPath": "//g' | sed -e 's/",//g');

呼び出し:

sudo ./docker-logs-clean.sh <container-name>;

@sgarbesiありがとう!
+1

ログクリアコマンドの場合は+1

?を支持して閉鎖

https://github.com/docker/compose/issues/1083#issuecomment -149357280からの私のコメントを繰り返し

要約すると、次のようになります。

  • これは作成ファイルから実行できます(https://github.com/docker/compose/issues/1083#issuecomment-141936600を参照)
  • #265は、logsコマンドからの出力を制限できることをカバーしています
  • #1756は再利用されたコンテナケースをカバーしています

探しているのがdocker logs --clearようなコマンドで、docker engineでサポートされていない場合は、docker / dockerでリクエストする必要があります。 ただし、ほとんどの場合、上記のオプションですでに十分であると思います。 ほとんどの人が望んでいるのは、実際にログを削除するのではなく、ログのサブセットを表示することです。

@dnephin 、そして他のみんなの貢献に感謝します。 私はほぼ1年前にこの問題を提起しましたが、それ以降のコメントから判断すると、ログ管理が多くの作成ユーザーにとって問題点であることは明らかです。

いくつかの回避策が言及されていますが、私自身は主にmax-sizeを使用してログを適切な長さに保ちます。 これは大いに役立ちます。これらの回避策には感謝していますが、これは解決策ではなく_回避策_であることを覚えておくことが重要です。

これを修正する責任の一部がDockerロギングシステム内にあり、Composeが利用するにはclearコマンドを提供する必要があることも今では明らかです-十分に公平です。

ただし、このチケットが作成されてからDockerリリースに組み込まれた機能がいくつかあります。つまり、 --since=<timestamp>--tail=<num-lines>は、Composeでサポートされ、実際の提供に近づくことができます。この問題の解決策。

たとえば、 --sinceサポートすると、次のようなことが可能になります。

$ docker-compose logs --since=now my_container

または

$ docker-compose logs --since=5m my_container

--tailサポートも役立ちます。

$ docker-compose logs --tail=100 my_container

そしてもちろん、それらの組み合わせ。 loggingブロックの一部としてdocker-compose.ymlこれらをサポートすることも理にかなっているかもしれませんが、それがなくても、これら2つのオプションをサポートするだけで、+を持っている大多数の人々を満足させることができると思います。このチケットを1つにしました。

要約すると、すべてのフィードバックと回避策、およびDockerとCompose自体(どちらも優れた製品です)に改めて感謝します。このスレッドで提案されたアイデアを検討し、これらの製品をさらに大きくしていきたいと思います。

要約については#2227を参照してください

:+1: @dnephinに感謝し

私がしたことは、 <container-id>-json.log内に配置された/var/lib/docker/containers/<container-id>/sudo )。 docker-compose logsを実行すると、ログは空になりました。 これは解決策ではありませんが、適切な.bashファイルを使用すると、各ビルドの前にクリーニングを自動化できます。

編集:このようなものがトリックを行います(あなた自身の責任で使用してください!!):

sudo find /var/lib/docker/containers/ -type f -name '*-json.log' -delete

+1

+1

+1

+1

+2

+2

+1

+20

+1

+1

+1

+1

@sgarbesiそのクリーンコマンドを実行した後、ログ機能は正常に機能しますか?

+1

docker-logs-clean.sh

#!/bin/bash

for container_id in $(docker ps -a --filter="name=$name" -q);

    do file=$(docker inspect $container_id | grep -G '"LogPath": "*"' | sed -e 's/.*"LogPath": "//g' | sed -e 's/",//g');

    if [ -f $file ]
      then
          rm $file;
    fi

done

呼び出し:


chmod +x docker-logs-clean.sh

sudo ./docker-logs-clean.sh

ログを手動でクリアするためのコマンドラインオプションの+1

@kassanmoor私のために行います。

+1

コンテナログをクリーンアップする他の方法をありがとう

👍

+1👍

+1!

+1

+1

+1

これは素晴らしい機能です。Javaベースのコンテナがいくつかあります。トラブルシューティングを行うと、Javaがこれらの複数行を愛しているため、 docker logs -f <container>を実行するのに30秒以上かかる場合があります。ログ。

実装が簡単なもう1つのことは、たとえば既存のすべてのログdocker logs -f -n <container>をエコーせずにテールを開始するログの別のフラグです(つまり、新しいログのみを追跡します)。 これは、コマンドの実行後に受信したログメッセージのみをエコーし​​ます。

逆も機能します(そしてgnuテールが機能する方法に近くなります)-fは最後の5〜10行をエコーし​​、次にデフォルトで新しい行をエコーし​​、現在と同じようにすべてをエコーするフラグを追加します(おそらくdocker logs -f -a <container>か何か)。

その点で、 docker logs -100 <container>ようにテールする行数を指定できるgnu tailの機能があれば、最後の100行が得られます。

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

Docker for Macのトリックはありますか? このためのコマンドラインオプションをありがとうと+1 :)

+1

+1

+1

更新:2016/10 / 08-「dockerlogs」がGoテンプレートをサポートするため、「jq」の要件が削除されました。 (https://docs.docker.com/engine/admin/formatting/)

こんにちは、みんな、

開いている可能性のあるファイルを削除することは一般的に悪い考えであるため、特にディスクスペースを節約しようとしている場合はそうです。 - @ sgarbesi@ lvitals@ wazoo (アイデアの人に感謝)の最初の取り組みを拡張して、以下のもう少し機能的なスクリプトを作成しました。

以下のコードをファイルにコピーします
vi ./docker-container-log-trim.sh
ファイルを実行可能にする
chmod +x ./docker-container-log-trim.sh
次に、
sudo ./docker-container-log-trim.sh

スクリプトを信頼する場合は、 >行のコメントを解除します...そこで魔法が起こります。 :-)

フィードバックを歓迎します。
ありがとう。

PS。 テスト済みですが、戦闘強化はされていません。 自己責任で使用してください。

#!/bin/bash

# NOTES:
#  Does NOT delete logfile (BAD IDEA) - simply trims file with redirect.
#  Handles single/all-running/all-existing containers - see end of script for usage.
#  Enjoy :-)


_get_container_logfile() {

  case $1 in

    running) _trim_container_logfile "$(docker ps -q)" $2
             ;;

        all) _trim_container_logfile "$(docker ps -aq)" $2
             ;;

          *) _trim_container_logfile "$(docker ps -a | awk -v ID=$1 '$1 ~ ID || $NF ~ ID {print $1}')" $2
             ;;

  esac

}


_trim_container_logfile() {

  TEMP=$(mktemp)

  case $2 in
    *[!0-9]*) echo "[lines] must be a number - \"$2\" is not a number."
              exit 1
              ;;
        ''|*) MAX=${2:-1000}
              ;;
  esac


  if [ -z $1 ]
  then
    echo "Container name/id unknown!"
    exit 1
  else
    for container in $1
    do
      logfile="$logfile $(docker inspect --format '{{ .LogPath }}' $container)"
      echo "Keeping $MAX lines: $logfile"

      tail -n ${MAX} $logfile > $TEMP
      # Uncomment the next line when you trust the script!
      # cat $TEMP > $logfile
    done
  fi

  rm $TEMP
}


if [ -a "$(which docker)" ]
then
  case $1 in
    --trim) if [ -z $2 ]
            then
              echo "Container name/id missing!"
              exit 1
            else
              _get_container_logfile $2 $3
            fi
            ;;

    --trim-running) _get_container_logfile running $2
                    ;;

    --trim-all) _get_container_logfile all $2
                ;;

    *) echo "Usage:"
       echo "  --trim {container} [lines]   Keep [lines] of logfile for a single container"
       echo "  --trim-running     [lines]   Keep [lines] of logfile for all running containers"
       echo "  --trim-all         [lines]   Keep [lines] of logfile for all containers"
       echo "Default: lines=1000"
       exit 1
       ;;
  esac
else
  echo "Requires \"docker\""
  exit 1
fi

+1

+1

それで、明示的な明確なコマンドが欲しいと何度も表明され、追加されたものがなかったので、これが再開される可能性はありますか?

もちろん、Dockerエンジンの変更にもよりますが、最終的にはdocker-composeでも対処する必要があります。明示的なコマンドに関する限り、これは完全に修正されていません。

@DavidPesticcioスクリプトの実行時に次のエラーが発生します: line 53: $logfile: ambiguous redirect (コメントを削除した後)

こんにちは@ gingerlime 、$ TEMPが入力されていないようです...「mktemp」がインストールされていないか、パスにない可能性がありますか? :-/

「私にとっては問題なく動作します」-ええ、それはあなたにとってあまり助けにはなりませんが、それは本当です... :-)

スクリプトを更新したので、「jq」はもう必要ありません。mktempもない場合は、ベイルアウトを追加する必要があります。これは標準ツールだと思いましたが、実行していない可能性があります。 「標準」インストール内のスクリプト-最小限のコンテナ内からのように? :-)

お役に立てば幸いです。

私はmktemp持っていて、それを頻繁に使用しています...デバッグにあまり時間をかけませんでした。 上記のより単純なスクリプトで終わり、それらのログを削除するだけです。 私たちの開発環境では、それらは重要ではありません。

私のセットアップ(つまり、rootユーザーなしで実行している)では、このbashスクリプトは、ログファイルを開こうとして許可が拒否されているために役立ちません。

少し奇妙なことに、ユーザーとしてdockerを起動できますが、ログファイルを取得できます...
docker / docker-composeコマンドに何かを費やす理由の詳細

前述のエラーのため、 @ DavidPesticcioのスクリプトを変更する必要があり

#!/bin/bash

# NOTES:
#  Does NOT delete logfile (BAD IDEA) - simply trims file with redirect.
#  Handles single/all-running/all-existing containers - see end of script for usage.
#  Enjoy :-)


_get_container_logfile() {

  case $1 in

    running) _trim_container_logfile "$(docker ps -q)" $2
             ;;

        all) _trim_container_logfile "$(docker ps -aq)" $2
             ;;

          *) _trim_container_logfile "$(docker ps -a | awk -v ID=$1 '$1 ~ ID || $NF ~ ID {print $1}')" $2
             ;;

  esac

}


_trim_container_logfile() {

  TEMP=$(mktemp)

  case $2 in
    *[!0-9]*) echo "[lines] must be a number - \"$2\" is not a number."
              exit 1
              ;;
        ''|*) MAX=${2:-1000}
              ;;
  esac


  if [ -z "$1" ]
  then
    echo "Container name/id unknown!"
    exit 1
  else
    for container in $1
    do
      logfile="$(docker inspect --format '{{.LogPath}}' $container)"
      if [ ! -f "$logfile" ]; then continue; fi
      echo "Keeping $MAX lines: $logfile"

      tail -n ${MAX} "$logfile" > "$TEMP"
      # Uncomment the next line when you trust the script!
      # cat "$TEMP" > "$logfile"
    done
  fi

  rm "$TEMP"
}


if [ -a "$(which docker)" ]
then
  case $1 in
    --trim) if [ -z $2 ]
            then
              echo "Container name/id missing!"
              exit 1
            else
              _get_container_logfile $2 $3
            fi
            ;;

    --trim-running) _get_container_logfile running $2
                    ;;

    --trim-all) _get_container_logfile all $2
                ;;

    *) echo "Usage:"
       echo "  --trim {container} [lines]   Keep [lines] of logfile for a single container"
       echo "  --trim-running     [lines]   Keep [lines] of logfile for all running containers"
       echo "  --trim-all         [lines]   Keep [lines] of logfile for all containers"
       echo "Default: lines=1000"
       exit 1
       ;;
  esac
else
  echo "Requires \"docker\""
  exit 1
fi

@dnephinログに対して明示的なワンタイムクリアコマンドが必要なことは明らかなので、これを再開できる可能性はありますか?

特定のコンテナのログを切り捨てます(ルートである必要があります)。

cp /dev/null $(docker inspect -f '{{.LogPath}}' container_name)

削除ではなく、切り捨てが必要です。 (開いているファイルハンドルによって参照されているファイルを削除しても、プロセス(この場合はDockerデーモン)が完全に終了するまでスペースが再利用されません)

@oogaliは十分に公平です。 それでも、オンデマンドでそれを実行するための適切なコマンドがあると便利です。

+1

適切なコマンドがあればいいのに

+1
オンデマンドで実行するための適切なコマンドがあると便利です。

これは簡単なことではありません。フィルターとして開始日を設定するのは、現在の出力を確認するためにフィルターをクリアするよりも手間がかかります。 この機能を追加してください。

+1

+1

+1

+1

+1

接線方向に関連する提案:

docker-compose logs -f 、自動的にデフォルトで--tail=30 (またはその他の妥当な数値)になります。

多数のログが表示されると非常に長い時間がかかるため、 docker-compose logs -fでは不十分です。

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

または、この回避策もあります

logpath=`docker inspect --format='{{.LogPath}}' reveelium_metricsextraction_1` && mv $logpath $logpath".bckup"

+1のコメントはやめてください。 このスレッドは、貴重な情報を読んだり抽出したりするのが非常に難しくなります。 このためのOP投稿には親指を立てるボタンがあります。

Docker for Macでは、ここでは何も機能しません。 ただし、このスレッドとDockerフォーラムを読んだことに基づいて機能するものを一緒にハッキングしました。

D4Mの問題は、Macでは、xhyvevmで実際にコマンドを実行する必要があることです。 これが私が思いついたものです。 これらの2つの関数.bash_profile追加します。

重要:続行する前に、新しいシェルを開始するか、プロファイルをリロードすることを忘れないでください。


これで、 docker-logs-cleanは次のようになります。

#!/bin/bash -e

if [[ -z $1 ]]; then
    echo "No container specified"
    exit 1
fi

logFile=$(docker inspect -f '{{.LogPath}}' $1 2> /dev/null)

echo -n "Cleaning ${logFile}... "
d4mexec << EOF
> $logFile
EOF
echo "done"

私はログファイルをrmではなく、 >実行しているだけで、ファイルが完全に切り捨てられることに注意してください。

dockerのFWIW-バージョン2で、ログファイルのサイズを制限する機能を作成します。

version: '2'
services:
  my-service:
    image: nginx:alpine
    restart: always
    logging:
      # limit logs retained on host to 25MB
      driver: "json-file"
      options:
        max-size: "500k"
        max-file: "50"

DockerのWebサイトにはあまり文書化されておらず、他の人にも役立つ可能性があります。

+1

+1

+1

+1

+1

簡単なスクリプトdocker_clear_log.shを作成し
sudo truncate -s 0 $(docker inspect --format='{{.LogPath}}' $1)
使用法:./ docker_clear_log.sh [名前またはID]
dockerにsudo権限とlog_driver: "json-file"設定がある場合は機能するはずです(デフォルト)。

+1

私も解決策を一時的に試みました、そしてそれはうまくいくようです

元の問題は解決されず、問題はとにかく閉じられました。 面白い。 @djessup 、あなたはそれらのリンゴがどうですか?

docker-compose logs--cleanがあればまだいいでしょう

問題自体が解決されていないのに、なぜこの問題はコメントなしでクローズされたのですか?

@linvi

私がこのスレッドに来たとき、最後のコメントは他のコメントに折りたたまれていました。 ここにあります:

https://github.com/docker/compose/issues/1083#issuecomment -149357280

彼らは、この特定のユースケースを間接的な手段でカバーすることを望んでいると思います。 あなたが特定のユースケースであり、それがどのようにカバーされていないかを述べてください。それはチケットを再開するのに役立つかもしれません。 最悪の場合、誰かがあなたが欲しいものを手に入れる簡単な方法を指摘するかもしれません:D

更新はありますか?

ログがある場合は、簡単な方法でクリアできるはずです。

コマンドを組み込むことができれば、本当に素晴らしいでしょう。 これは難しいことではないようです。
何千人もの人々がすべてをスクロールする必要がないことを非常に喜んでいるでしょう。

docker -composeを使用する場合は、ログの表示にください。 その後、ログを削除する必要はありません。 ライブログを取得し、最新のログから始めます。 これはデバッグに非常に役立ちます。

grafik

https://github.com/jesseduffield/lazydocker
1行でインストールでき、優れた監視ツールです。 「ログの削除」機能が良いことだと人々が理解するのはそれほど合理的ではないのは残念です。

しかし、レイジードッカーを使用した回避策は私のためにそれを行います。 監視ツールで怠惰になる可能性を与えてくれたjesseduffieldに感謝します:-)
デバッグや監視も簡単になる場合は、lazydockerへの寄付を検討してください。
そして、Dockerの開発者/メンテナーにとって:Dockerのインターフェースがそのようになっていないのはなぜですか?
Dockerはかなり素晴らしいですが、lazydockerを見てください。 改善の余地があります。

+2147483647

+49324893

このページは役に立ちましたか?
0 / 5 - 0 評価