Docker 컨테이너 로그를 단일 파일로 리디렉션하는 방법은 무엇입니까?


111

Docker 컨테이너의 모든 로그를 단일 로그 파일로 리디렉션하여 분석하고 싶습니다. 나는 시도했다

docker logs container > /tmp/stdout.log 2>/tmp/stderr.log

그러나 이것은 두 개의 다른 파일에 로그를 제공합니다. 나는 이미 시도했다

docker logs container > /tmp/stdout.log

하지만 작동하지 않았습니다.

답변:


137

로그를 리디렉션 할 필요가 없습니다.

Docker는 기본적으로 로그를 하나의 로그 파일에 저장합니다. 로그 파일 경로를 확인하려면 명령을 실행하십시오.

docker inspect --format='{{.LogPath}}' containername

/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log

해당 로그 파일을 열고 분석하십시오.

로그를 리디렉션하면 리디렉션 전에 만 로그를 받게됩니다. 라이브 로그를 볼 수 없습니다.

편집하다:

라이브 로그를 보려면 아래 명령을 실행할 수 있습니다.

tail -f `docker inspect --format='{{.LogPath}}' containername`

노트 :

이 로그 파일 /var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log은 로그가없는 경우도 커가 로그를 생성하는 경우에만 생성되며이 파일은 존재하지 않습니다. 우리가 명령을 실행 docker logs containername하고 아무 것도 반환하지 않는 경우와 비슷 합니다. 이 시나리오에서는이 파일을 사용할 수 없습니다.


tail -f `docker inspect --format='{{.LogPath}}' myapp`- 정말 JSON입니다
아담

해당 파일이 없으면 실패합니다. 도 커가 로그를 생성하지 않으면이 파일이 생성되지 않음을 의미합니다. 그러나도 커가 로그를 생성하는 경우이 명령은 라이브 로그를 보는 것이 좋습니다. 감사합니다 Adam. 다른 사람들을 돕기 위해 내 대답에 추가합니다.
pl_rock

"Docker는 기본적으로 로그를 하나의 로그 파일에 저장합니다." -어떤 맥락에서? 도커 호스트에서 실행되는 모든 컨테이너가 단일 파일로 출력됩니까? 컨테이너 하나?
Chris Stryczynski 19 년

@ChrisStryczynski 도커 컨테이너 당 로그 파일을 만듭니다
에디 에르난데스에게

127

이 옵션은 어떻습니까?

docker logs containername >& logs/myFile.log

질문에서 요청한 로그를 리디렉션하지 않고 특정 파일에 한 번 복사합니다.


내가 틀리지 않은 경우이 명령은 기본적으로 컨테이너가 시작되었을 때부터 myFile.logs에 모든 로그를 복사합니다. 권리.?
S Andrew

@ SAndrew 기본적으로 예! 그러나 새 버전의 Docker는 변경 될 수 있습니다. 더 잘 볼 수 docker logs --help확인하기 위해
에디 에르난데스에게

39

docker logs -f <yourContainer> &> your.log &

설명:

  • -f(예 --follow) : 모든 기존 로그를 쓰고 계속합니다 ( 다음 다음 온다 로깅 다).
  • &> 표준 출력과 표준 오류를 모두 리디렉션합니다.
  • 아마도 백그라운드에서 해당 메서드를 실행하고 싶을 것 &입니다.
  • 다음 > output.log 2> error.log을 사용하여 출력과 stderr을 분리 할 수 ​​있습니다 (를 사용하는 대신 &>).

9

Docker 컨테이너에서 단일 로그 파일로 stdout 및 stderr를 모두 캡처하려면 다음을 실행하십시오.

docker logs container > container.log 2>&1

8

컨테이너가 여러 개 있고 로그를 단일 파일로 집계하려는 경우 fluentd와 같은 로그 집계기를 사용해야합니다. fluentd는 도커 컨테이너의 로깅 드라이버로 지원됩니다.

따라서 docker-compose에서 로깅 드라이버를 정의해야합니다.

  service1:
    image: webapp:0.0.1
    logging:
      driver: "fluentd"
      options:
        tag: service1 

  service2:
        image: myapp:0.0.1
        logging:
          driver: "fluentd"
          options:
            tag: service2

두 번째 단계는 서비스 1과 서비스 2 모두에 대한 로그를 제공하도록 fluentd conf를 업데이트하는 것입니다.

 <match service1>
   @type copy
   <store>
    @type file
    path /fluentd/log/service/service.*.log
    time_slice_format %Y%m%d
    time_slice_wait 10m
    time_format %Y%m%dT%H%M%S%z
  </store>
 </match> 
 <match service2>
    @type copy
   <store>
    @type file
    path /fluentd/log/service/service.*.log
    time_slice_format %Y%m%d
    time_slice_wait 10m
    time_format %Y%m%dT%H%M%S%
  </store>
 </match> 

이 구성에서는이 경로에 대한 단일 파일에 로그를 작성하도록 요청합니다.
/fluentd/log/service/service.*.log

세 번째 단계는 로그를 파일에 쓰기 시작하는 사용자 정의 fluentd를 실행하는 것입니다.

여기에 단계별 지침에 대한 링크

조금 길지만 로그 파일 경로 등을 더 많이 제어하고 Docker Swarm에서도 잘 작동하므로 올바른 방법입니다.


1

Docker는 stdout과 stderr를 병합하므로 다른 쉘 스트림과 마찬가지로 로그 출력을 처리 할 수 ​​있습니다. 현재 로그를 파일로 리디렉션하려면 리디렉션 연산자를 사용하십시오.

$ docker logs test_container > output.log
docker logs -f test_container > output.log

출력을 stderr 및 stdout으로 보내는 대신 애플리케이션의 출력을 파일로 리디렉션하고 파일을 컨테이너 외부의 영구 저장소에 매핑합니다.

$ docker logs test_container> /tmp/output.log

Docker는 명령 줄에서 상대 경로를 허용하지 않으므로 다른 디렉터리를 사용하려면 전체 경로를 사용해야합니다.


1

Windows에서 작업하고 PowerShell (예 : 나)을 사용하는 경우 다음 줄을 사용하여 stdoutand 를 캡처 할 수 있습니다 stderr.

 docker logs <containerId> | Out-File 'C:/dev/mylog.txt'

누군가에게 도움이되기를 바랍니다!


1
컨테이너 이름을 기준으로 모든 컨테이너 로그를 파일에 저장하려면 ...foreach ($element in $(docker ps -a --format "{{.Names}}")) {docker logs $element | Out-File "C:/dockerlogs/$element.log"}
xisket

1

내가 사용하는 가장 쉬운 방법은 터미널에서 다음 명령을 사용하는 것입니다.

docker logs elk > /home/Desktop/output.log

구조는 다음과 같습니다.

docker logs <Container Name> > path/filename.log

1

먼저 컨테이너 ID를 확인하십시오.

docker ps -a

CONTAINER ID 열에서 첫 번째 행을 볼 수 있습니다. 아마도이 "3fd0bfce2806"처럼 보일 것입니다. 그런 다음 쉘에 입력하십시오.

docker inspect --format='{{.LogPath}}' 3fd0bfce2806

다음과 같은 것을 볼 수 있습니다.

/var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log

그러면 다음과 같이 볼 수 있습니다.

cat /var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log

JSON 형식이므로 타임 스탬프를 사용하여 오류를 추적 할 수 있습니다.


0

모든 컨테이너 로그를 지정된 디렉토리에 복사하는 Bash 스크립트 :

#!/usr/bin/env bash

TARGET_DIR=~/logs/docker_logs
mkdir -p "$TARGET_DIR"
for name in `sudo docker ps --format '{{.Names}}'`;
do
    path=$(sudo docker inspect --format='{{.LogPath}}' $name)
    sudo cp -rf "$path" "$TARGET_DIR"/$name.log
done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.