Simple is IT, 누구나 보고 누구나 깨닫는 IT

Docker Container Logging_syslog(2/4) 본문

Simple is IT/Cloud & Container

Docker Container Logging_syslog(2/4)

currenjin 2020. 7. 18. 15:38

Container Logging

도커는 컨테이너의 로그를 기본적으로 Json-file로 저장합니다.

그 밖에도 각종 로깅 드라이버를 사용하도록 설정해 컨테이너의 로그를 수집할 수도 있죠.

우리가 다뤄볼 것은 syslog, fluentd, awslogs 입니다.

 

Syslog

컨테이너의 로그는 JSON뿐만 아니라 syslog로 보내 저장하도록 설정할 수 있습니다.

syslog는 유닉스 계열 OS에서 로그를 수집하는 오래된 표준이에요!

Kernel, Security 등 시스템과 관련된 로그, 애플리케이션 로그 등 다양한 종류의 로그를 수집해 저장하죠.

유닉스 계열의 OS에서는 Syslog를 사용하는 인터페이스가 모두 동일해 체계적으로 관리할 수 있어요.

 

우리는 --log-driver 옵션을 통해  syslog에 로그를 저장하는 컨테이너를 생성할거에요.

아래 옵션으로 컨테이너를 생성하면 syslogtest라는 문구를 출력하고 종료될 겁니다.

docker run -d \
> --name syslog \
> --log-driver=syslog \
> ubuntu:16.04 \
> echo syslogtest

 

syslog의 경로는 OS마다 다른데요.

CentOS 같은 경우에는 /var/log/messages, 제가 쓰는 Ubuntu 같은 경우에는 /var/log/syslog 입니다.

# cat /var/log/syslog
.....
Jul 18 14:51:21 master fd25400ee4c4[3225]: syslogtest
.....

로그를 확인해보니 정상적으로 기록이 되었음을 알 수 있네요.

 

이러한 syslog는 원격 서버에 설치된다면 로그 옵션을 추가해 로그 정보를 원격 서버로 보낼 수 있죠.

이런 동작을 가능하게하는 rsyslog를 사용해 중앙 컨테이너로 로그를 저장해 볼거에요.

 

rsyslog

docker run -it \
-h rsyslog \
--name rsyslog_server \
-p 514:514 -p 514:514/udp \
ubuntu:16.04

 

컨테이너 내부의 rsyslog.conf 파일에서 syslog 서버를 구동시키는 항목의 주석을 해제해 저장합니다.

root@rsyslog:/# vi /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")

 

 

설정 변경했으니 서비스 재시작!

root@rsyslog:/# service rsyslog restart

 

빠져나와 로그를 출력하기 위한 컨테이너를 생성합니다.

docker run -itd \
--log-driver=syslog \
--log-opt syslog-address=tcp://192.168.99.100:514 \
--log-opt tag="log" \
ubuntu:16.04 echo "syslog test!"

생성한 컨테이너는 syslog test 라는 문장을 외친 후 자동으로 종료됩니다.

--log-opt는 로깅 드라이버에 추가할 옵션을 뜻해요.

syslog-address에서 rsyslog 컨테이너 접근을 위한 주소를 입력하고,

tag는 로그 데이터가 기록될 때 함께 저장될 태그입니다. 주로 로그를 분류할 때 사용하죠.

 

rsyslog 서버 컨테이너에서 돌아와 로그가 기록되었는지 확인해볼까요?

$ docker exec -it rsyslog_server tail /var/log/syslog
.....
Jul 18 14:22:50 192.168.99.100 log[2599]: #033]0;root@0f6ca2286dac: /#007root@0f6ca2286dac:/# exit#015
Jul 18 14:23:11 192.168.99.100 log[2599]: syslog test!#015

성공적으로 로그가 기록되었네요. 또 추가한 'log' 태그도 눈에 띄는군요 ㅎㅎ

 

여기서 추가로 --log-opt 옵션에서는 syslog-facility를 사용할 수 있어요.

이 옵션은 로그를 생성하는 주체에 따라 로그를 다르게 저장하는 것입니다.

예를들어, 여러 애플리케이션 중 mail에서 로그가 출력된다면 mail이라는 파일로 저장을 하는것이죠!

docker run -itd \
--log-driver=syslog \
--log-opt syslog-address=tcp://192.168.99.100:514 \
--log-opt tag="maillog" \
--log-opt syslog-facility="mail" \
ubuntu:16.04 echo "syslog test!"

 

이제 서버 컨테이너는 새로운 로그 파일이 생겨 maillog를 저장하게 될 거에요.

$ docker exec -it rsyslog_server tail /var/log/mail.log
Jul 18 14:32:31 192.168.99.100 maillog[2599]: syslog test!#015

 

 

지금까지 사용했던 syslog와 rsyslog는 유닉스 계열 OS에서 사용할 수 있는 가장 기본적인 Logging 방법이었어요. 하지만 별도의 UI를 제공하지는 않지만 logentries, LogAnalyzer 등과 같은 로그 분석기와 연동하면 웹 인터페이스를 활용해 편리하게 로그를 확인할 수 있답니다.

Comments