programing

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

starjava 2023. 8. 5. 09:45
반응형

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

도커 컨테이너의 모든 로그를 단일 로그 파일로 리디렉션하여 분석하려고 합니다.나는 노력했다.

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

반응형