Cloud System Engineer

컨테이너 로깅 본문

리눅스/docker

컨테이너 로깅

클라우드 엔지니어 2021. 1. 31. 20:11

json-file 로그 사용하기

 

컨테이너는 표준 출력(StdOut)과 에러(StdErr) 로그를 별도의 메타데이터 파일로 저장하며 이를 확인하는 명령어를 제공한다  먼저 컨테이너를 생성해 간단한 로그를 남겨보자  다음 명령은 mysql5.7 버전의 컨테이너를 생성하고 로그를 확인해 본다.

 

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

 

이번에는 환경변수 없이 컨테이너를 시작해 본다.  환경변수가 없으면 컨테이너가 시작되지 않는다.
# docker run -d --name no_password_mysql mysql:5.7

 

 

 

 

시작이 되질 않는다.

 

이때 로그로 컨테이너 상태를 확인하려면
# docker logs no_password_mysql
# docker logs --tail 2 mysql
# docker logs -f -t mysql

-f 는 스트림 상태 -t 는 시간으로 나타내준다.

뭐가 문제인지 알 수가 있다.

 

 

 

 

docler logs 명령어는 run 명령어에서 -i -t 옵션을 설정해 docker attach 명령어를 사용할 수 있는 컨테이너에도 사용할 수 있으며, 컨테이너 내부엣 bash 쉘 등을 입출력한 내용을 확인할 수 있다.
# docker run -i -t --name logstest ubuntu:14.04

 

컨테이너 확인

# docker logs logstest
echo test!
test!

 

컨테이너에 썼던 내용이 로그로 출력된다.

 

기본적으로 위와 같은 컨테이너 로그는 JSON 형태로로 도커 내부에 저장된다.  이 파일은 다음 경로에 컨테이너의 ID로 시작하는 파일명으로 저장된다.

 

컨테이너 ID긁어서 ls 결과화면

 

 

 

json 파일의 크기 제한
# docker run -it --log-opt max-size=10k --log-opt max-file=3 --name log-test ubuntu:14.04 
어떠한 설정도 하지 않았다면 도커는 위와같이 컨테이너 로그를 JSON 파일로 저장하지만 그밖에도 각종 로깅 드라이버를 사용하게 설정해 컨테이너 로그를 수집할 수 있다.  사용가능한 드라이버로는 syslog, journald, fluentd, awslogs 등이 있다.

 

 

1) syslog 로그
syslog는 유닉스 계열 운영체제에서 로그를 수집하는 오래된 표준 중 하나로서, 커널 보안 등 시스템과 관련된 로그, 어플리케이션의 로그 등 다양한 종류의 로그를 수집해 저장한다.  다음과 같이 syslog에 로그를 저장하는 컨테이너를 생성해 보자 syslogtest 라는 문구를 출력하고 컨테이너는 종료될 것이다.
# docker run -d --name syslog_container -log-driver=syslog ubuntu:14.04 echo syslogtest

 

 

syslog 로깅 드라이버는 기본적으로 로컬호스트의 syslog에 저장하므로 운영체제 및 베포판에 따라 syslog 파일의 윛를 알아야 이를 확인할 수 있다.
우분투 14.04는 /var/log/syslog, CentOS와 RHEL은 /var/log/messages 팡일에서,  우분투 16.04와 CoreOS는 journalctl -u docker.service 명령어로 확인할 수 있다.
# tail /var/log/messages // CentOS, RHEL
# tail /var/log/syslog // 우분투

 

 

centos 7 버전이라 

 tail /var/log/messages 해야한다.

 

 

syslog를 원격 서버에 설치하는 rsyslog를 써서 로그를 중앙 컨테이너에 저장해 보자
서버 : 192.168.10.128
클라이언트: 192.168.10.129
(내 기준)

 

서버 호스트에서 다음과 같이 rsyslog 컨테이너를 생성한다.

# docker run -i -t -h rsyslog --name rsyslog_server -p 514:514 -p 514:514/udp ubuntu:14.04

컨테이너 내부의 rsyslog.conf 파일을열어  syslog 서버를 구동시키는 항목의 주석을 해제한 후 변경사항을 저장한다.

 

 

실행이 안되면 apt-get update

apt-get install vim 설치후

 

vim /etc/rsyslog.conf

 

주석제거 

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

 

 


서비스 재시작
# service rsyslog restart

 

 

 

다음은 클라이언트 호스트에서 컨테이너를 생성
client@192.168.10.135# docker run -i -t --log-driver=syslog --log-opt syslog-address=tcp://192.168.10.128:514 --log-opt tag="mylog" ubuntu:14.04

 

 

 

root@7a2e2d9c2676:/# echo test

test

 

 

--log-opt 로깅 드라이버에 추가할 옵션을 뜻하며, syslog-address에 rsyslog 컨테이너에 접근 할 수 있는 주소를 입력한다.  tag는 로그 데이터가 기록될 때 함께 저장될 태그이며 로그를 분류하기 위해 사용한다.

다시 서버의 rsyslog 컨테이너로 되돌아와 컨테이너 내부의 syslog 파일을 확인해 보면 로그가 전송된 것을 알 수 있다.
root@rsyslog:/# tail /var/log/syslog

 

--log-opt 옵션으로 syslog-facility를 쓰면 로그가 저장될 파일을 바꿀 수 있다.  facility는 로그를 생성하는 주체에 따라 로그를 다르게 저장하는 것으로, 여러 어플리케이션에서 수집되는 로그를 분류하는 방법이다.  기본적으로 daemon으로 설정돼 있지만 kern, user, mail 등 다른 facility를 사용할 수 있다.

# docker run -i -t --log-driver syslog --log-opt syslog-address=tcp://192.168.10.128:514 --log-opt tag="maillog" --log-opt syslog-facility="mail" ubuntu:14.04

서버 컨테이너에 해당 facility에 해당하는 새로운 로그 파일이 생성된다.

 

 

 

 

kern, user, mail 등 다른 facility 생성됨

 

 

2) fluentd 로깅
각종 로그를 수집하고 저장할 수 있는 기능을 제공하는 오픈소스 도구로써, 도커 엔진의 컨테이너의 로그를 fluentd를 통해 저장할 수 있도록 플러그인을 공식적으로 제공한다. 데이터 포맷으로 JSON을 사용하기 때문에 쉽게 사용할 수 있을 뿐만 아니라 수집되는 데이터를 AWS S3, HDFS, MongoDB 등 다양한 저장소에 저장할 수 있다.

3) 아마존 클라우드 워치 로그
AWS(Amazon Web Service)에서는 로그 및 이벤트 등을 수집하고 저장해 시각적으로 보여주는 클라우드 워치를 제공한다.  도커를 AWS EC2에서 사용하고 있다면 다른 도구를 별도로 설치할 필요 없이 컨테이너에서 드라이버 옵션을 설정하는 것만으로 클라우드 워치 로깅 드라이버를 사용할 수 있다.
클라우드 워치를 사용하는 것은 다음 단계를 따른다.
ⓐ 클라우드 워치에 해당하는 IAM 권한 생성
ⓑ 로그 그룹 생성
ⓒ 로그 그룹에 로그 스트림 생성
ⓓ 클라우드 워치의 IAM  권한을 사용할 수 있는 EC2 인스턴스 생성과 로그 전송

 

'리눅스 > docker' 카테고리의 다른 글

도커 cpu 자원 할당  (0) 2021.02.01
컨테이너 자원 할당 제한  (0) 2021.01.31
MAC VLAN 네트워크  (0) 2021.01.29
도커 네트워크  (0) 2021.01.29
도커 볼륨  (0) 2021.01.29