업무/정리 & 오류

[Docker] docker compose 로그 관리 (syslog)

phyho 2025. 11. 26. 14:19

 

* docker compose 로그 설정 *

 

1. json-file (기본값)
컨테이너 로그(stdout/stderr)를 호스트 파일에 JSON 라인 형태로 저장.

logging:
  driver: "json-file"
  options:
    max-size: "50m"
    max-file: "5"
  • max-size : 로그 파일 하나의 최대 크기.
  • max-file : 로테이션 시 보관할 파일 갯수.

 

2. syslog
컨테이너 로그를 호스트의 syslog (rsyslog, syslog-ng등) 로 전송.

logging:
  driver: "syslog"
  options:
    syslog-address: "udp://127.0.0.1:514"
    tag: "test_tag"
    syslog-facility: "local0"
  • syslog-address : 로그를 보낼 syslog 주소.
  • tag : syslog에 찍힐 태그.
  • syslog-facility : 카테고리 종류. (daemon, local0 등)

 


현재 docker compose의 컨테이너 두개가 한 쌍으로 작업을 처리하고 있고 
하나의 작업을 랜덤으로 할당받는 컨테이너 쌍이 4개, 즉 컨테이너 총 8개를 활용하고 있음.
각 컨테이너 4개의 로그를 하나의 파일에서 확인하고 싶어 syslog 방식을 활용해봄.

 


 

 docker compose 설정파일에 아래와 같이 로깅 드라이버를 syslog로 설정하고 태그를 달아준다.

services:
  test_app_01:
    image: test_app:latest
    container_name: test_app_01
    logging:
      driver: "syslog"
      options:
        tag: "test_app"
        
  test_app_02:
    image: test_app:latest
    container_name: test_app_02
    logging:
      driver: "syslog"
      options:
        tag: "test_app"
        
        ....

  test_worker_01:
    image: test_worker:latest
    container_name: test_worker_01
    logging:
      driver: "syslog"
      options:
        tag: "test_worker"

  test_worker_02:
    image: test_worker:latest
    container_name: test_worker_02
    logging:
      driver: "syslog"
      options:
        tag: "test_worker"

		....
  • test_app
    • test_app_01 (컨테이너 1-1)
    • test_app_02 (컨테이너 1-2)
    • test_app_03 (컨테이너 1-3)
    • test_app_04 (컨테이너 1-4)
  • test_worker
    •  test_worker_01 (컨테이너 2-1)
    •  test_worker_02 (컨테이너 2-2)
    •  test_worker_03 (컨테이너 2-3)
    •  test_worker_04 (컨테이너 2-4)

 

위처럼 test_app 태그를 가진 컨테이너가 4개, test_worker 태그를 가진 컨테이너가 4개가 되는데, 
rsyslog 에서 같은 태그는 동일한 소스라고 인식한다. 
이 태그를 기준으로 동일한 로그파일에 컨테이너 4개의 로그를 통합하면 된다.

 


 

rsyslog 설정파일 생성.
sudo vi /etc/rsyslog.d/30-test.conf

template(name="AppLog" type="string"
         string="/var/log/app/%programname%.log")

if $syslogtag startswith 'test_' then {
    action(
        type="omfile"
        dynaFile="AppLog"
        createDirs="on"
    )
    stop
}
  • type="omfile" : 어떤 output 모듈을 쓸지 지정하는 옵션.
    • omfile (output module file) - 파일로 쓰는 모듈.
  • dynaFile="AppLog" : 어디에 쓸지(파일 경로)를 템플릿으로 정하는 옵션.
    • 위에서는 상단 template 결과 문자열을 파일 경로로 사용.
  • createDirs="on"
    • dynaFile 경로 중에 중간 디렉토리가 없으면 자동 생성.

설정파일 변경 후에는 재시작 필요!
sudo systemctl restart rsyslog

 


 

같은 태그를 가진 컨테이너의 로그는 하나의 로그파일에 쌓이게 된다.
test_app_01 ~ test_app_04  => test_app.log 
test_worker_01 ~ test_worker_04  => test_worker.log