본문 바로가기

카테고리 없음

Ubuntu에서 Docker container의 로그 관리하기

지난 몇 주동안 on-premise 환경을 구축하는 프로젝트를 진행했다.

On-premise 환경에 배포하는 것은 단순히 환경을 구축하는 데에서 끝나지 않고, 이슈가 생길 때마다 그 원인을 파악하고 유지해야 할 필요도 있다. 그러다 보니, 로그를 오랜 기간 유지할 수 있어야 하기도 하고, 컨테이너가 멈추더라도 기존의 로그를 트래킹 할 수 있어야 하기도 한다. 그래서 이번엔 Docker container의 로그가 컨테이너의 상태와 무관하게 관리하는 방법에 대해 자세히 정리해보고자 한다.

 

 

Step 1. Docker Container 의 log driver 설정하기

docker 에서 제공해주는 log driver 의 종류는 json-file, journald, syslog 와 같은 것들이 있다.

결론부터 말해보자면 journald를 선택하게 되었다.

기본적으로 systemd의 저널링 시스템을 활용할 수 있기 때문에 크게 공수를 들이지 않고서도 로그를 관리할 수 있는 편이다.

특히나 내가 사용해야 하는 로그의 보관 기간 등의 설정도 (다음 스텝에서 살펴보겠지만) 비교적 간편하게 할 수 있다.

version: '3'
services:
  my-app:
    image: my-application
    logging:
      driver: journald

 

실제로 설정하는 방법은 간단하다.

docker 에서 자체적으로 제공을 해주고 있는 만큼 위와 같은 방식으로 드라이버를 설정할 수 있다.

 

드라이버가 잘 설정되었는지 확인하려면 아래와 같이 입력해서 확인할 수도 있다.

docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>

 

 

 

Step 2. Journald에서 파일의 생애주기 관리하기

이번 단계에서는 journald의 설정을 추가해보자.

journald 의 공식문서에 따르면 여러가지 옵션을 지정해줄 수 있지만, 이번 글에서는 영구 저장수를 설정하고, 로그를 1개월까지 보존하도록 설정해볼 예정이다.

 

journald 의 설정 파일은 아래와 같은 경로에서 확인할 수 있다. (해당 정보는 아래의 참고 링크를 통해서도 확인할 수 있다)

/etc/systemd/journald.conf
/run/systemd/journald.conf
/usr/local/lib/systemd/journald.conf
/usr/lib/systemd/journald.conf
/etc/systemd/journald.conf.d/*.conf
/run/systemd/journald.conf.d/*.conf

 

 

해당 위치에 이미 파일이 존재한다면 해당 파일 위에 작업을 진행해도 괜찮고, 존재하지 않는다면 새로운 파일을 생성해보자.

vi /etc/systemd/journald.conf

 

 

그리고 아래의 코드를 복사해서 붙여넣어보자.

Storage=persistent

SystemMaxUse=1G

MaxRetentionSec=1month

Compress=yes

 

순서대로 

  • Storage: 파일을 저장하는 방식이다. default 값은 auto인데, auto는 해당 위치에 디렉토리가 존재한다면 persistent처럼 동작하고 그게 아닌 경우에는 none인 것처럼 파일로 관리하지 않게 된다.
  • SystemMaxUse: 로그 파일이 무한하게 생성되는 것을 막는다. 최대 용량을 설정하면 
  • MaxRetentionSec: 로그의 보관 기간을 설정한다. 숫자와 정해진 규칙대로 입력하면 그에 맞게 파일을 관리하게 된다. 사용할 수 있는 것은 "year", "month", "week", "day", "h", "m" 등이 있다.
  • Compress: 이름 그대로 압축할지에 대한 여부다. default 값이 enabled 이기 때문에 압축하고 싶지 않을 경우 사용할 수 있다.

 

여기까지 마쳤다면, ubuntu 서버에서 journald를 재시작해주어야 한다.

재시작하기 위해서는 아래의 커맨드를 입력해주어 재시작할 수 있다.

systemctl status systemd-journald

 

 

Step 3. journalctl 로 로그 쿼리하기

설정까지 마쳤다면 이젠 journalctl을 사용하여 컨테이너의 로그를 쿼리해보자.

기본적으로 컨테이너 별 로그를 조회하고 싶은 경우 아래와 같이 사용할 수 있다.

journalctl CONTAINER_NAME=container_name
 
journalctl 에서는 이외에도 로그를 편리하게 조회할 수 있게 해주는 몇가지 옵션을 제공한다.
 
그 중에서도 일시와 관련된 옵션을 간단하게 몇가지 소개해보고자 한다.
  • since: 로그 조회의 시작 일시 지정
  • until: 로그 조회의 마지막 일시 지정
  • 설정 방식: "2012-10-30 18:17:16" 혹은 "now", "yesterday", "today"와 같은 방식으로 사용 가능
 
 

참고