Docker & Kubernetes

도커 컨테이너 로깅(Docker Container Logging)

beekei 2022. 12. 27. 20:07
반응형

컨테이너 내부에서 어던 일이 일어나는지 아는 것은 디버깅뿐만 아니라 운영 측면에서도 중요하다.

도커는 컨테이너의 표준 출력(StdOut)과 에러(StdErr) 로그를 별도의 메타데이터 파일로 저장하며 이를 확인하는 명령어를 제공한다.

 

docker logs 명령어를 사용해 컨테이너의 표준 출력을 확인할 수 있다.

$ docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=1234 \
mysql:5.7

$ docker logs mysql
2022-12-27 10:19:09+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.40-1.el7 started.
2022-12-27 10:19:10+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2022-12-27 10:19:10+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.40-1.el7 started.
2022-12-27 10:19:10+00:00 [Note] [Entrypoint]: Initializing database files
....

--tail 옵션을 사용해 마지막에서 n째 줄까지 로그를 확인할 수 도 있다.

$ docker logs --tail 2 mysql
2022-12-27T10:21:59.091914Z 0 [Note] mysqld: ready for connections.
Version: '5.7.40'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

--since 옵션에 유니스 시간을 입력해 특정 시간 이후의 로그를 확인할 수 있으며, -t 옵션으로 타임스탬프를 표시할 수 있고 -f 옵션을 통해 실시간 로그 스트림도 확인 가능하다.

$ docker logs --since 1672136519 -t -f mysql
2022-12-27T10:21:59.013523058Z 2022-12-27T10:21:59.013078Z 0 [Note] InnoDB: Completed initialization of buffer pool
2022-12-27T10:21:59.016955654Z 2022-12-27T10:21:59.016464Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
실시간 로깅 ....

 

기본적으로 로그는 도커 내부에 저장되는데 JSON 형태로 아래 경로에 저장된다.

/var/lib/docker/containers/<컨테이너ID>/<컨테이너ID>-json.log

그러나 컨테이너 내부의 출력이 너무 많은 상태로 방치하면 json 파일의 크기가 계속해서 증가해 호스트 저장 공간을 전부 사용할 수 도 있다.

--log-opt 옵션으로 컨테이너 json 로그 파일의 최대 크기를 지정할 수 있다.

$ docker run -d \
--name mysql5.7 \
--log-opt max-size=10k --log-opt max-file=3 \
-e MYSQL_ROOT_PASSWORD=1234 \
mysql:5.7

max-size는 로그 파일의 최대 크기, max-file은 로그 파일의 개수를 의미한다.

기본적으로 도커는 위와 같이 컨테이너 로그를 JSON 파일로 저장하지만 --log-driver 옵션을 사용해 각종 로깅 드라이버(syslog, journald, fluentd, awslogs 등등..)를 사용할 수도 있다.

반응형