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

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

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

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

docker logs container > /tmp/stdout.log

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



답변

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

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하고 아무 것도 반환하지 않는 경우와 비슷 합니다. 이 시나리오에서는이 파일을 사용할 수 없습니다.


답변

이 옵션은 어떻습니까?

docker logs containername >& logs/myFile.log

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


답변

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

설명:

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

답변

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

docker logs container > container.log 2>&1


답변

컨테이너가 여러 개 있고 로그를 단일 파일로 집계하려는 경우 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에서도 잘 작동하므로 올바른 방법입니다.


답변

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는 명령 줄에서 상대 경로를 허용하지 않으므로 다른 디렉터리를 사용하려면 전체 경로를 사용해야합니다.


답변

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

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

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