도커 컨테이너 로그를 단일 파일로 리디렉션하는 방법은 무엇입니까?
도커 컨테이너의 모든 로그를 단일 로그 파일로 리디렉션하여 분석하려고 합니다.나는 노력했다.
docker logs container > /tmp/stdout.log 2>/tmp/stderr.log
하지만 이것은 두 개의 다른 파일에 있는 로그를 제공합니다.난 이미 해봤다.
docker logs container > /tmp/stdout.log
하지만 효과가 없었습니다.
이 옵션은 어떻습니까?
docker logs containername >& logs/myFile.log
질문에 요청된 로그를 리디렉션하지 않고 특정 파일에 한 번 복사합니다.
로그를 리디렉션할 필요가 없습니다.
도커는 기본적으로 로그를 하나의 로그 파일에 저장합니다.로그 파일 경로를 확인하려면 run 명령을 실행합니다.
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 -f <yourContainer> &> your.log &
설명:
-f
다음과 같이)--follow
): 기존의 모든 로그를 기록하고 다음에 오는 모든 로그를 기록합니다.&>
표준 출력과 표준 오류를 모두 리디렉션합니다.- 당신은 그 방법을 백그라운드에서 실행하기를 원할 가능성이 높습니다.
&
. - 은 다음과 같이 구분할 수 .
> output.log 2> error.log
(&>
).
도커 컨테이너에서 단일 로그 파일로 stdout 및 stderr를 모두 캡처하려면 다음을 실행합니다.
docker logs container > container.log 2>&1
컨테이너가 여러 개 있고 로그를 단일 파일로 집계하려면 fluentd와 같은 로그 집계기를 사용해야 합니다.fluentd는 도커 컨테이너의 로깅 드라이버로 지원됩니다.
따라서 도커 구성에서 로깅 드라이버를 정의해야 합니다.
service1:
image: webapp:0.0.1
logging:
driver: "fluentd"
options:
tag: service1
service2:
image: myapp:0.0.1
logging:
driver: "fluentd"
options:
tag: service2
두 번째 단계는 fluentd conf를 업데이트하여 서비스 1 및 서비스 2의 로그를 모두 충족하는 것입니다.
<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 logs <container-id> > mylogs.txt 2>&1
먼저 컨테이너 ID를 확인합니다.
docker ps -a
컨테이너 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 형식일 것입니다. 타임스탬프를 사용하여 오류를 추적할 수 있습니다.
터미널에서 사용하는 가장 쉬운 방법은 다음 명령입니다.
docker logs elk > /home/Desktop/output.log
구조:
docker logs <Container Name> > path/filename.log
이 명령은 다음과 같습니다.
$ docker logs -f containername &> /tmp/out.log &
모든 컨테이너 로그를 지정된 디렉토리에 복사하는 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
@juanmirocks가 컨테이너 출력을 파일에 지속적으로 기록하도록 지적했듯이, 다음을 사용할 수 있습니다.
docker logs -f <yourContainer> &> your.log &
기존 파일 데이터를 덮어쓰는 대신 끝에 추가하려면 addredirector를 사용할 수 있습니다.>>
출력 리다이렉터 대신&>
다음과 같이:
docker logs -f <yourContainer> >> your.log &
Windows에서 작업하고 PowerShell(나처럼)을 사용하는 경우 다음 행을 사용하여 다음을 캡처할 수 있습니다.stdout
그리고.stderr
:
docker logs <containerId> | Out-File 'C:/dev/mylog.txt'
누군가에게 도움이 되기를 바랍니다!
도커 로그 -f 도커_컨테이너_이름 >> YOUR_LOG_PATH 2>&1 &
도커가 stdout과 stderr를 병합하기 때문에 로그 출력을 다른 셸 스트림처럼 처리할 수 있습니다.현재 로그를 파일로 리디렉션하려면 리디렉션 연산자를 사용합니다.
$ docker logs test_container > output.log
docker logs -f test_container > output.log
stderr 및 stdout으로 출력을 보내는 대신 응용 프로그램의 출력을 파일로 리디렉션하고 파일을 컨테이너 외부의 영구 저장소에 매핑합니다.
$ docker logs test_container> /tmp/output.log
도커는 명령줄에서 상대 경로를 허용하지 않으므로 다른 디렉토리를 사용하려면 전체 경로를 사용해야 합니다.
언급URL : https://stackoverflow.com/questions/41144589/how-to-redirect-docker-container-logs-to-a-single-file
'programing' 카테고리의 다른 글
Maria의 "SSL 필요" 및 "X509 필요" SSL 옵션의 차이점DB (0) | 2023.08.05 |
---|---|
jQuery().load()를 중단하는 중 (0) | 2023.08.05 |
process.env의 값을 변경하는 방법.node.js의 PORT? (0) | 2023.08.05 |
SQL Server에서 특정 문자 뒤에 문자열을 분할하고 이 값을 특정 열로 업데이트하는 방법 (0) | 2023.08.05 |
보기 찾기 기준ID가 null을 반환합니다. (0) | 2023.08.05 |