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

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

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



답변

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

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의 유니버설 포워더로 보내면 “로컬”드라이버를 피할 수 있습니다.

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


답변

사용하다:

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

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

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

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

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


답변

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

docker logs -f --tail 100

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

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


답변

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


답변

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

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

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


답변

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.


답변

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

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

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