프로그래밍/도커

도커 syslog, rsyslog를 사용하여 log수집하는 방법.

Hwan2 2023. 3. 21. 01:36
반응형

도커를 실행하면 기본적으로 모든 stdout, stderr에 대한 출력 값을 볼 수 있습니다.

 

$ docker logs [Container ID]

를 입력하면, 도커에서 실행된 모든 stdout, stderr를 확인할 수 있습니다.

 

1. syslog

syslog는 유닉스/리눅스의 로그 정보를 담고 있는 파일입니다.

도커 log는 --log-driver=syslog 명령어를 사용해서 Host의 syslog로 전송이 가능 합니다.

$ docker run -it --log-driver=syslog ubuntu

root# echo hwani

그 후 컨테이너를 빠져나와서 Host의 syslog를 확인해보면 hwani라는 단어가 찍힌 것을 확인할 수 있습니다.

# cat /var/log/messages | grep hwani
Mar 20 12:24:47 ip-172-31-11-2 3be8b7f52574[3871]: hwani

저는 Amazon linux2에서 실행했기 때문에, messages라는 곳에 저장되었습니다. ubuntu는 syslog에 저장될 것입니다.

 

2. rsyslog

rsyslog는 Linux에서 널리 사용되고 있는 로깅 서비스중 하나입니다. 

기존 알파인 리눅스의 ubuntu로 테스트를 해보려고 했으나, rsyslog가 구동조차 하지 않아서,

https://github.com/rsyslog/rsyslog-docker/tree/master/appliance/alpine

 

GitHub - rsyslog/rsyslog-docker: rsyslog docker containers

rsyslog docker containers. Contribute to rsyslog/rsyslog-docker development by creating an account on GitHub.

github.com

rsyslog/syslog_appliance_alpine가 설치된 docker를 받아서 실행했습니다.

 

rsyslog서버

$ docker run -it -p514:514 -p514:514/udp -d rsyslog/syslog_appliance_alpine

$ docker inspect cfe5 | grep -i ipaddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",

log전송은 기본적으로 514포트를 사용하기 때문에 514포트를 열어줍니다.

해당 rsyslog의 ip주소를 확인 후 클라이언트를 생성합니다.

 

rsyslog클라이언트

$ docker run -it \
--log-driver=syslog \
--log-opt syslog-address=tcp://172.17.0.3 \
--log-opt tag="hwani" \
ubuntu

root@0de6471194ce:/ echo "seifzsjelfs"
seifzsjelfs
root@0de6471194ce:/ echo "hwani
> "
hwani

root@0de6471194ce:/ exit

 

그 후 rsyslog서버에 들어가서 log를 확인해줍니다.

$ docker exec -it cfe5 /bin/sh
/home/appliance:/  cd /logs/hosts

/logs/hosts:/  ls
cfe5709555b1  ip-172-17-0-1.ap-northeast-2.compute.internal

/logs/hosts:/  cd ip-172-17-0-1.ap-northeast-2.compute.internal/
/logs/hosts/ip-172-17-0-1.ap-northeast-2.compute.internal:/ ls
messages.log

/logs/hosts/ip-172-17-0-1.ap-northeast-2.compute.internal:/ cat messages.log 
2023-03-20T15:38:54+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004h#033]0;root@0de6471194ce: /#007root@0de6471194ce:/# #015#033[K#033]0;root@0de6471194ce: /#007root@0de6471194ce:/# echo "seifzsjelfs"#015
2023-03-20T15:38:54+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004l#015seifzsjelfs#015
2023-03-20T15:38:56+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004h#033]0;root@0de6471194ce: /#007root@0de6471194ce:/# echo "hjw#010 #010#010 #010wani#015
2023-03-20T15:38:57+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004l#015#033[?2004h> "#015
2023-03-20T15:38:57+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004l#015hwani#015
2023-03-20T15:38:57+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #015
2023-03-20T15:38:59+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004h#033]0;root@0de6471194ce: /#007root@0de6471194ce:/# exit#015
2023-03-20T15:38:59+00:00 ip-172-17-0-1.ap-northeast-2.compute.internal hwani[3871]: #033[?2004l#015exit#015

로그를 보면 클라이언트에서 했던 모든 행위들이 기록되어 있는 것을 확인할 수 있습니다.

(엔터, 특수문자 같은 것들이 #00의 숫자형태로 나타나는 것 같습니다. 가독성이 그렇게 좋아보이진 않네요.)

 

그리고 해당 이미지는 Docker volume설정이 되어 있어서 Host에서도 확인이 가능 합니다.

$ docker inspect cfe --format '{{json .Mounts}}' | jq
[
  {
    "Type": "volume",
    "Name": "5e3a85ca8aebf0033dc4fa4dd69b13c9c41038d387f5ea9f8a24b46360a4007c",
    "Source": "/var/lib/docker/volumes/5e3a85ca8aebf0033dc4fa4dd69b13c9c41038d387f5ea9f8a24b46360a4007c/_data",
    "Destination": "/config",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
  },
  {
    "Type": "volume",
    "Name": "00bec34911319db0ba514671d240065393aa2ea948080bc59f3acaeb8e9298ba",
    "Source": "/var/lib/docker/volumes/00bec34911319db0ba514671d240065393aa2ea948080bc59f3acaeb8e9298ba/_data",
    "Destination": "/logs",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
  },
  {
    "Type": "volume",
    "Name": "9dbfd9933452d0d8554738793461ced4101f79e88ba7666d2d9e32d13041f8d3",
    "Source": "/var/lib/docker/volumes/9dbfd9933452d0d8554738793461ced4101f79e88ba7666d2d9e32d13041f8d3/_data",
    "Destination": "/work",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
  }
]
$ cd /var/lib/docker/volumes/00bec34911319db0ba514671d240065393aa2ea948080bc59f3acaeb8e9298ba/_data
$ ls
debug  hosts

 

3. 그 외 옵션들

도커 log는 기본적으로 json형태로 저장되게 됩니다. 그리고 계속 log를 append하는 형태로 기록이 됩니다.

이 log들은 결국 disk 용량을 계속 차지하게 되고, 제대로 관리를 안해준다면 결국 Container는 터지게 될 것입니다.

 

이럴때 로그 용량의 최대치를 정하고 그 이상되면 로그 용량을 오래된 것부터 지워나갈 수 있습니다.

 

  • --log-opt max-size=10k : 로그 파일의 최대 크기를 10kb로 정합니다. 해당 크기를 초과하면 새로운 log파일을 생성합니다.
  • --log-opt max-file=5 : 로그의 최대 파일 갯수입니다. 만약 저 옵션에서 5개가 넘어간다면, 가장 오래된 파일을 지우고 새로운 파일을 생성합니다.
  • 그 외 awslogs, gcplogs, fluentd 등을 사용할 수 있습니다.

도커 로그 옵션에 대한 것들은 여기에 있습니다.

https://docs.docker.com/config/containers/logging/configure/

 

Configure logging drivers

 

docs.docker.com

 

반응형