답변:
로그를 리디렉션 할 필요가 없습니다.
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 --help
확인하기 위해
docker logs -f <yourContainer> &> your.log &
설명:
-f
(예 --follow
) : 모든 기존 로그를 쓰고 계속합니다 ( 다음 다음 온다 로깅 다).&>
표준 출력과 표준 오류를 모두 리디렉션합니다.&
입니다.> output.log 2> error.log
을 사용하여 출력과 stderr을 분리 할 수 있습니다 (를 사용하는 대신 &>
).컨테이너가 여러 개 있고 로그를 단일 파일로 집계하려는 경우 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 (예 : 나)을 사용하는 경우 다음 줄을 사용하여 stdout
and 를 캡처 할 수 있습니다 stderr
.
docker logs <containerId> | Out-File 'C:/dev/mylog.txt'
누군가에게 도움이되기를 바랍니다!
foreach ($element in $(docker ps -a --format "{{.Names}}")) {docker logs $element | Out-File "C:/dockerlogs/$element.log"}
먼저 컨테이너 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 형식이므로 타임 스탬프를 사용하여 오류를 추적 할 수 있습니다.
tail -f `docker inspect --format='{{.LogPath}}' myapp`
- 정말 JSON입니다