본문 바로가기

DevOps & Infra/Docker

[Infrastructure/Docker] 로컬 및 원격에서 syslog 로깅 드라이버 구성하기, syslog 로그 파일 경로

syslog

syslog는 Unix 계열 OS에서 사용되는 표준 로그 시스템 중 하나입니다. 커널, 시스템, 보안과 관련된 로그 뿐만 아니라 실행 중인 애플리케이션과 관련된 로그까지 모두 수집하여 기록합니다. 다음 경로에서 syslog 로그 파일을 확인 할 수 있습니다.

  • Ubuntu - /var/log/syslog
  • RHEL, CentOS - /var/log/messages

syslog 로깅 드라이버 사용하기

도커 컨테이너를 실행할 때 로깅 드라이버를 명시적으로 선택 할 수 있습니다. 만약 로깅 드라이버를 명시하지 않았다면 도커는 디폴트로 json-file 로깅 드라이버를 사용합니다.

$ docker run --log-driver=syslog [이미지 이름]

간단한 테스트를 위해서 다음과 같이 비지박스(Busybox) 컨테이너를 실행합니다. 컨테이너는 실행 직후 "Hello World"를 출력하고 종료됩니다. 로깅 드라이버는 syslog를 사용하고 있습니다.

$ docker run \
-d \
--rm \
--name syslog-test \
--log-driver=syslog \
busybox \
echo "Hello World"

이어서 syslog 로그 파일을 출력합니다(Ubuntu 환경이라면 /var/log/syslog를 출력합니다).

$ tail -20 /var/log/messages

컨테이너의 표준 출력이 syslog 파일에 기록되어 있습니다.

Apr 13 05:34:40 ip-172-31-0-9 kernel: docker0: port 1(veth23c962c) entered blocking state
Apr 13 05:34:40 ip-172-31-0-9 kernel: docker0: port 1(veth23c962c) entered forwarding state
...
Apr 13 05:34:41 ip-172-31-0-9 9bf0041ee433[18522]: Hello World
...

원격 호스트에 로깅

syslog 로깅 드라이버를 사용하면 syslog 로그 서버가 열려있는 원격 호스트에 로그를 기록 할 수 있습니다. 테스트를 위해서는 다음 환경을 구축해야 합니다.

  • 로컬 호스트에서 Ubuntu 컨테이너 실행 및 syslog 로그 서버 시작
  • 로컬 호스트에서 Busybox 컨테이너 실행 및 Ubuntu 컨테이너에 로깅

테스트 환경에서 Ubuntu와 Busybox 컨테이너는 물리적으로 동일한 호스트에서 실행되지만, 서로 다른 물리적인 환경에서 네트워크로 연결되어있다고 가정합니다.

Ubuntu 컨테이너 실행 및 syslog 로그 서버 시작

Ubuntu 컨테이너를 실행하기 위해 로컬 호스트에서 다음 명령문을 실행합니다.

$ docker run -it --rm --name rsyslog-test --network="host" ubuntu

이제부터는 Ubuntu 컨테이너 내부에서 실행합니다. Ubuntu CLI가 열리면 rsyslog 패키지를 설치합니다.

$ apt-get update
$ apt-get install rsyslog

도커 컨테이너로 실행되는 Ubuntu에서는 아직 vi 명령어를 사용 할 수 없습니다. vim 패키지를 설치합니다.

$ apt-get install vim

/etc/rsyslog.conf 경로 파일의 다음 내용을 주석 해제합니다.

# provides UDP syslog reception
module(load="imudp")                # 주석 해제
input(type="imudp" port="514")      # 주석 해제

# provides TCP syslog reception
module(load="imtcp")                # 주석 해제
input(type="imtcp" port="514")      # 주석 해제

환경 설정 파일을 저장하고 rsyslog 서비스를 재시작합니다.

$ service rsyslog restart

이제 Ubuntu 컨테이너에서 syslog 로그 서버가 활성화되었습니다. syslog 로그 파일을 실시간으로 출력하도록 다음 명령문을 실행합니다.

$ tail -f /var/log/syslog

Busybox 컨테이너 실행 및 Ubuntu 컨테이너에 로깅

기존에 실행중인 Ubuntu 컨테이너를 유지한채로 로컬 호스트의 새로운 CLI를 실행합니다. 다음 명령문으로 Busybox 컨테이너를 실행합니다.

$ docker run \
-d \
--rm \
--name syslog-test \
--log-driver=syslog \
--log-opt syslog-address=tcp://localhost:514 \
--log-opt tag="syslog-test" \
busybox \
echo "Hello World"

로깅 드라이버로 syslog를 사용하고 있습니다. 기존 방식과의 차이는 syslog-address 및 tag와 같은 로깅 옵션이 추가되었다는 점입니다. 자세한 내용은 syslog 로깅 드라이버 옵션 도큐먼트에서 확인 할 수 있습니다.

Apr 13 06:35:49 docker-desktop rsyslogd: imklog: cannot open kernel log (/proc/kmsg): Operation not permitted.
Apr 13 06:35:49 docker-desktop rsyslogd: activation of module imklog failed [v8.2001.0 try https://www.rsyslog.com/e/2145 ]
Apr 13 06:35:49 docker-desktop rsyslogd: rsyslogd's groupid changed to 102
Apr 13 06:35:49 docker-desktop rsyslogd: rsyslogd's userid changed to 101
Apr 13 06:35:49 docker-desktop rsyslogd: [origin software="rsyslogd" swVersion="8.2001.0" x-pid="946" x-info="https://www.rsyslog.com"] start
Apr 13 06:43:39 localhost syslog-test[1493]: Hello World

다시 Ubuntu 컨테이너 CLI를 확인해볼까요? 이번 섹션을 따라서 진행했다면 "Hello World" 로그가 실시간으로 출력된 것을 확인 할 수 있습니다.

구분 Timestamp Hostname Tag Log
Apr 13 06:43:39 localhost syslog-test Hello World
비고 로깅 일시 로깅 출처 호스트(작성자) 로깅 출처(--log-opt tag로 지정) 로그 내용