Docker 컨테이너의 로그를 올바르게 지우는 방법은 무엇입니까?


210

docker logs [container-name]특정 컨테이너의 로그를 보는 데 사용 합니다.

이 로그를 지우는 우아한 방법이 있습니까?


14
참고로 다음을 통해 로그 크기를 얻을 수 있습니다.sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
Daniel F

답변:


251

이 질문 에서 실행할 수있는 하나의 라이너가 있습니다.

echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

또는 비슷한 잘림 명령이 있습니다.

truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

Docker의 파일을 직접 수정하기 때문에 둘 중 하나의 팬이 아닙니다. docker가 json 형식의 데이터를 파일에 쓰는 동안 부분적인 줄이 생기고 docker logscli 에서 로그를 읽는 기능이 손상되는 동안 외부 로그 삭제가 발생할 수 있습니다.

대신 Docker가 자동으로 로그를 회전하도록 할 수 있습니다. 기본 JSON 로깅 드라이버를 사용하는 경우 dockerd에 추가 플래그를 사용하여 수행됩니다 .

dockerd ... --log-opt max-size=10m --log-opt max-file=3

시작 스크립트를 수정하는 대신 이것을 daemon.json 파일의 일부로 설정할 수도 있습니다 .

{
  "log-driver": "json-file",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

이 옵션은 루트 액세스로 구성해야합니다. systemctl reload docker설정을 적용하려면이 파일을 변경 한 후 a를 실행하십시오 . 이 설정은 새로 만든 컨테이너의 기본값이됩니다. 새 로그 제한을 받으려면 기존 컨테이너를 삭제하고 다시 만들어야합니다.


이와 유사한 로그 옵션을 개별 컨테이너에 전달하여 이러한 기본값을 재정의 할 수 있으므로 개별 컨테이너에 더 많거나 적은 로그를 저장할 수 있습니다. 에서 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 로그에 대한 직접 액세스에 의존하는 외부 로그 파서 / 전달자가 더 이상 작동하지 않습니다. 따라서 filebeat와 같은 도구를 사용하여 Elastic 또는 Splunk의 유니버설 포워더로 보내면 "로컬"드라이버를 피할 수 있습니다.

나는 팁과 트릭 프레젠테이션 에서 이것에 대해 조금 더 알게되었습니다 .


6
나는 service docker restart 그 자체로는 효과가 없었습니다. 또한 새로운 컨테이너를 만들려면 브랜드를 만들어야했습니다. 즉, 오래된 컨테이너를 가져 오는 것만으로 새로운 로깅이 적용되지 않았습니다
Robbo_UK

Docker 1.13.1을 사용하고 있는데 'docker inspect --format ='{{. LogPath}} '<container id>'는 null 문자열 ( "")을 반환합니다.하지만 여전히 ' 도커 로그 <컨테이너 ID> '?!? 어디에서 왔으며 어떻게 지우나요?
JD Allen

@JDAllen 1.13.1은 오래 지원되지 않습니다. 검사 출력을 볼 수있는 오래된 시스템이 없습니다.
BMitch

더 나은 아직 것입니다 echo -n > .... 어쨌든 내 로그를 더 잘 제어 할 수 있기를 원합니다. 예를 들어, docker-compose restart 후에 는 보존 된 로그로 무언가를 수행하는 메커니즘을 갖고 싶습니다.
NarūnasK

2
@AlexisWilke Docker를 중지 할 수 있으면 컨테이너를 중지 할 수 있습니다. 후자를 할 수 있다면 로깅 옵션을 사용하여 컨테이너를 다시 만드는 것이 좋습니다. 새 컨테이너에는 이전 로그가 없으며 새 로그가 자동으로 롤링되어 단기 및 장기 문제를 동시에 해결합니다.
BMitch

227

사용하다:

truncate -s 0 /var/lib/docker/containers/*/*-json.log

당신은 sudo가 필요할 수 있습니다

sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

심판. 제프 에스 Docker 컨테이너의 로그를 올바르게 지우는 방법은 무엇입니까?

참조 : 파일을 사용하는 동안 파일 잘라 내기 (Linux)


4
자르기 : 쓰기 위해 '/var/lib/docker/containers/*/*-json.log'를 열 수 없음 : 해당 파일 또는 디렉토리가 없음
BTR Naidu

2
@ BTRNaidu 당신은 루트 / sudo로 실행해야하며, 그 containers밖의 내용은 사용할 수 없습니다.
spydon

25
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"-나를 위해 일했다
Jeff S.

7
위의 두 전문가를 무시하십시오. 확실하지 않은 경우 "ls /var/lib/docker/containers/*/*-json.log"에서 잘린 내용을 확인하면됩니다.
duketwo

1
로그 파일을 비운 후 다음 오류가 발생합니다.error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
arcol

42

Windows 및 Mac 용 Docker 및 기타 장치에서도 tail 옵션을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

docker logs -f --tail 100

이렇게하면 마지막 100 줄만 표시되며 1M 줄을 먼저 스크롤 할 필요가 없습니다 ...

(따라서 로그를 삭제해야 할 수도 있습니다)


12
아이디어는 로그 파일을 정리하고 마지막 n 줄의 로그 파일을 인쇄하지 않는 것입니다.
Youssouf Maiga

41
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

4
로그의 크기를 얻으려면 로그 sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"의 전체 크기 만 가져 오십시오.sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
Daniel F

dockerd / aufs에서 회전 된 로그 파일을 무시하고 제거 할 수없는 문제가 있습니까?
ThorSummoner

이 명령은 나를 위해 일한 반면이 SO의 다른 명령은 그렇지 않았습니다. 중요한 경우 CentOS 7에서 Docker 버전 18을 실행하고 있습니다.
Tundra Fizz

27

정기적으로 로그를 지우도록 logrotate를 설정할 수 있습니다.

/etc/logrotate.d/docker-logs의 예제 파일

/var/lib/docker/containers/*/*.log {
 rotate 7
 daily
 compress
 size=50M
 missingok
 delaycompress
 copytruncate
}

어떻게 사용합니까? docker run? 와 함께 기본값으로 사용됩니다 . 파일 /etc/logrotate.d/docker-logs이 존재하지 않습니다. 파일 을 만들어야합니까?
Carlos.V

logrotate 유틸리티 (logrotate <config-file>)를 호출해야하며 구성을 읽고 정리를 실행합니다. 예를 들어 크론 작업으로 설정할 수도 있습니다.
AlexPnt

이 문제는도 커가 수행하는 작업과 올바르게 동기화되지 않을 수 있다는 것입니다. 도커 기능을 사용하는 것이 훨씬 현명합니다. ( "log-opts"BMitch에 의해 표시됨)
Alexis Wilke

12

2018 솔루션 인 Docker4Mac :

LOGPATH=$(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- truncate -s0 $LOGPATH

첫 번째 줄은 허용되는 답변과 비슷한 로그 파일 경로를 가져옵니다.

두 번째 줄에서는 Docker4Mac의 모든 도커 컨테이너에 대한 호스트로 서버 인 VM nsenter에서 명령을 실행할 수 있습니다 xhyve. 우리가 실행하는 명령은 truncate -s0 $LOGPATHMac 이외의 답변에 익숙 합니다.

를 사용하는 경우 docker-compose첫 번째 줄은 다음과 같습니다.

local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))

<service>에서 서비스 이름 당신의docker-compose.yml 파일.

트릭에 대한 https://github.com/justincormack/nsenter1 에게 감사합니다 nsenter.


4
그리고 모든 컨테이너의 로그를 잘라내려면 다른 답변에서와 같이 쉘 와일드 카드를 사용할 수 있으므로 다음 명령 중 하나 docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- sh -c 'truncate -s0 /var/lib/docker/containers/*/*-json.log'
일뿐입니다

11

Docker 명령을 통해 직접 수행 할 수 없습니다.

로그 크기를 제한하거나 스크립트를 사용하여 컨테이너와 관련된 로그를 삭제할 수 있습니다. 스크립트 예제는 아래에서 읽을 수 있습니다 (아래에서 읽음). 기능 : 로그 기록을 지우는 기능 # 1083

docker-compose 파일 참조 의 로깅 섹션 을 확인하십시오 . 여기서 일부 로깅 드라이버에 대한 옵션 (예 : 로그 회전 및 로그 크기 제한)을 지정할 수 있습니다.


7

루트 사용자 로서 다음을 실행하십시오.

>  /var/lib/docker/containers/*/*-json.log

또는

cat /dev/null > /var/lib/docker/containers/*/*-json.log

또는

echo "" > /var/lib/docker/containers/*/*-json.log

6

내 우분투 서버에서 sudo로도 얻을 수 있습니다. Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory

그러나 도커를 빗질하면 답을 검사하고 자릅니다.

sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`

2

나는 이것을 선호합니다 (위의 솔루션에서) :

truncate -s 0 /var/lib/docker/containers/*/*-json.log

그러나이 경로가 예상대로 작동하지 않는 여러 시스템 (예 : Ubuntu 18.x Bionic)을 실행하고 있습니다. Docker는 Snap을 통해 설치되므로 컨테이너 경로는 다음과 같습니다.

truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log

1

다음 docker run과 같이 명령 행 에서 log-opts 매개 변수를 제공 할 수도 있습니다 .

docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest

또는 이와 같은 docker-compose.yml에서

my-app:
image: my-app:latest
logging:
    driver: "json-file"
    options:
        max-file: "5"
        max-size: 10m

크레딧 : https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)


전역 daemon.json 파일에 대해 여기 에 표시된대로 매개 변수 값을 인용해야합니다 (즉 "5", "10m"각각) . docker-compose.yml의 경우와 동일합니다. 두 경우 모두 새로 만든 컨테이너에만 영향을 미칩니다.
Adrian W

@AdrianW : docker-compose.yml은 따옴표가 필요하지 않습니다. 이들은 완전히 다른 파일 형식입니다. 그리고 네, 맞습니다 : "docker run"명령과 docker-compose 매개 변수는 새로 작성된 컨테이너에만 영향을 미칩니다. 여기서는 대부분의 투표가 다시 시작된 dockerd 데몬에만 영향을 미치며 루트 액세스를 통해서만 사용할 수 있습니다. 내 대답은 전체 dockerd 프로세스를 다시 시작하는 것보다 편집보다 훨씬 간단하고 업데이트 된 경로를 보여야합니다.
Dag Baardsen

따옴표없이 : ERROR : app 용 서비스 응용 프로그램 용 컨테이너를 만들 수 없습니다 : json : Go struct 필드의 LogConfig.Config 문자열에서 숫자를 언 마샬링 할 수 없습니다. 문자열 유형의 문자열 다음과 같이 인용 "5"하면 작동합니다. 10m참 인용없이 작동합니다.
Adrian W

Docker for Windows와 Docker for Linux간에 차이가있는 것 같습니다. 후자는 값을 따옴표로 묶어야합니다. 전자에 없습니다. 설명을 둘 다에 맞게 업데이트했습니다. 감사합니다, @AdrianW
Dag Baardsen

0

Mac 사용자를위한 Docker는 다음과 같습니다.

    1. 다음을 통해 로그 파일 경로를 찾으십시오.

      $ docker inspect | grep log

    1. 도커 시스템에 SSH (이름이 default아닌 경우 docker-machine ls찾기 위해 실행 한다고 가정 ) :

      $ docker-machine ssh default

    1. 루트 사용자 ( reference )로 변경하십시오 .

      $ sudo -i

    1. 로그 파일 내용을 삭제하십시오.

      $ echo "" > log_file_path_from_step1


2
docker-machine은 Docker for Mac에서 작동하지 않습니다. 당신은 대신 실행할 수 있습니다 "고정 표시기 실행 -ti -v의 / var / lib 디렉토리 / 고정 표시기 / 용기의 경우 : / var / 처음에 CentOS bash는"다음 "잘라 내기 --size 0 /var/inception/08d29a7d469232cfef4456dc6eebcbf313bf01ba73e479520a036150c5ab84de/08d29a7d469232cfef4456dc6eebcbf313bf01ba73e479520a036150c5ab84de-json.log"
잠 쉬드

docker exec -it default sh컨테이너에 sh 쉘을 입력하는 데 사용할 수 있습니다 . 그러나 많은 컨테이너가 암시 적으로 sudo명령을 사용 가능 하게하지 않습니다 .
Dag Baardsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.