1. 개요
이 사용방법(예제)에서는 로컬 개발에서 지속 가능한 다중 컨테이너 솔루션에 이르기까지 Docker에서 Spring Boot 로그에 액세스하는 방법을 설명합니다.
2. 기본 콘솔 출력
먼저 이전 기사 에서 Spring Boot Docker 이미지를 빌드해 보겠습니다 .
$> mvn spring-boot:build-image
그런 다음 컨테이너를 실행하면 콘솔에서 즉시 STDOUT 로그를 볼 수 있습니다 .
$> docker run --name=demo-container docker.io/library/spring-boot-docker:0.0.1-SNAPSHOT
Setting Active Processor Count to 1
WARNING: Container memory limit unset. Configuring JVM for 1G container.
이 명령은 Linux shell tail -f 명령 과 같은 로그를 따릅니다 .
이제 application.properties 파일에 한 줄을 추가하여 로그 파일 어펜더로 Spring Boot 애플리케이션을 구성해 보겠습니다 .
logging.file.path=logs
그런 다음 실행 중인 컨테이너에서 tail -f 명령 을 실행하여 동일한 결과를 얻을 수 있습니다 .
$> docker exec -it demo-container tail -f /workspace/logs/spring.log > $HOME/spring.log
Setting Active Processor Count to 1
WARNING: Container memory limit unset. Configuring JVM for 1G container.
이것이 바로 단일 컨테이너 솔루션에 대한 것입니다. 다음 장에서는 구성된 컨테이너의 로그 기록 및 로그 출력을 분석하는 방법을 배웁니다.
3. 로그 파일용 Docker 볼륨
호스트 파일 시스템에서 로그 파일에 액세스해야 하는 경우 Docker 볼륨을 만들어야 합니다 .
이를 위해 다음 명령으로 애플리케이션 컨테이너를 실행할 수 있습니다.
$> mvn spring-boot:build-image -v /path-to-host:/workspace/logs
그러면 /path-to-host 디렉토리 에서 spring.log 파일을 볼 수 있습니다 .
Docker Compose 에 대한 이전 기사를 시작으로 Docker Compose 파일에서 여러 컨테이너를 실행할 수 있습니다.
Docker Compose 파일을 사용하는 경우 볼륨 구성을 추가해야 합니다.
network-example-service-available-to-host-on-port-1337:
image: karthequian/helloworld:latest
container_name: network-example-service-available-to-host-on-port-1337
volumes:
- /path-to-host:/workspace/logs
그런 다음 파일 작성 기사를 실행해 보겠습니다 .
$> docker-compose up
로그 파일은 /path-to-host 디렉토리 에서 사용할 수 있습니다 .
기본 솔루션을 검토했으므로 이제 고급 docker logs 명령을 살펴보겠습니다 .
다음 장에서는 Spring Boot 애플리케이션이 STDOUT에 로그를 인쇄하도록 구성되어 있다고 가정합니다.
4. 여러 컨테이너에 대한 Docker 로그
한 번에 여러 컨테이너를 실행하면 더 이상 여러 컨테이너에서 혼합 로그를 읽을 수 없습니다.
Docker Compose 문서에서 컨테이너는 기본적으로 docker logs 명령 을 지원하는 json-file 로그 드라이버 로 설정된다는 것을 찾을 수 있습니다 .
Docker Compose 예제 와 함께 작동하는 방식을 살펴보겠습니다 .
먼저 컨테이너 ID를 찾습니다.
$> docker ps
CONTAINER ID IMAGE COMMAND
877bb028a143 karthequian/helloworld:latest "/runner.sh nginx"
그런 다음 docker logs -f 명령을 사용하여 컨테이너 로그를 표시할 수 있습니다 . json 파일 드라이버 에도 불구하고 출력은 여전히 일반 텍스트임을 알 수 있습니다. JSON은 Docker에서 내부적으로만 사용됩니다.
$> docker logs -f 877bb028a143
172.27.0.1 - - [22/Oct/2020:11:19:52 +0000] "GET / HTTP/1.1" 200 4369 "
172.27.0.1 - - [22/Oct/2020:11:19:52 +0000] "GET / HTTP/1.1" 200 4369 "
-f 등의 옵션 동작합니다 꼬리 -f 쉘 명령이 생성 된 것으로 로그 출력을 반향한다.
Swarm 모드에서 컨테이너를 실행 하는 경우 대신 docker service ps 및 docker service logs 명령을 사용해야 합니다 .
문서 에서 docker logs 명령이 json-file , local 또는 journald 제한된 출력 옵션을 지원 한다는 것을 알 수 있습니다 .
5. 로그 집계 서비스용 도커 드라이버
고정 표시기 로그 명령은 보는 순간에 특히 유용하다 : 그것은 복잡한 필터 또는 장기 통계를 제공하지 않습니다.
이를 위해 Docker는 여러 로그 집계 서비스 드라이버를 지원합니다 . 이전 기사 에서 Graylog를 연구한 것처럼 이 플랫폼에 적합한 드라이버를 구성할 것입니다.
이 구성은 daemon.json 파일 의 호스트에 대해 전역적일 수 있습니다 . 그것은에 위치하고 을 / etc / 고정 표시기 리눅스 호스트 나에 C : \ 경우 ProgramData \ 고정 표시기 \ 설정 Windows 서버에서.
daemon.json 파일이 존재하지 않는 경우 생성해야 합니다.
{
"log-driver": "gelf",
"log-opts": {
"gelf-address": "udp://1.2.3.4:12201"
}
}
Graylog 드라이버를 GELF 라고 합니다. Graylog 인스턴스의 IP 주소를 지정하기만 하면 됩니다.
단일 컨테이너를 실행할 때 이 구성을 재정의할 수도 있습니다 .
$> docker run \
--log-driver gelf –-log-opt gelf-address=udp://1.2.3.4:12201 \
alpine echo hello world
6. 결론
이 기사에서는 Docker에서 Spring Boot 로그에 액세스하는 다양한 방법을 검토했습니다.
STDOUT에 로깅하면 단일 컨테이너 실행에서 매우 쉽게 로그를 관찰할 수 있습니다.
그러나 컨테이너에는 적절한 서버와 동일한 제약 조건이 없기 때문에 Docker 로깅 기능의 이점을 얻으려면 파일 어펜더를 사용하는 것이 최선의 선택이 아닙니다.