⚙️ Ops/Docker

Docker - Logging

신건우 2023. 5. 13. 22:42

Logging

도커는 컨테이너의 표준출력(stdout)과 에러(stderr)를 별도의 Metadata 파일로 컨테이너 내부에 저장한다.

저장 경로는 컨테이너 내부의 /var/lib/docker/containers/{container-id}/{container-id}-json.log 의 경로로 저장된다.

아래 명령어는 도커 컨테이너 내부의 로그를 출력하는 기본적인 명령어와 옵션들이다.

# 컨테이너 내부 로그 출력
$ docker logs {container-name}

# 컨테이너 내부 로그 끝 2줄만 출력
$ docker logs {container-name} --tail 2

# 컨테이너 내부 로그의 특정 시간대 검색 (유닉스 시간대 기준)
$ docker logs {container-name} --sinse

로그를 출력하는 다양한 옵션

--tail 2 : 로그의 끝에서 2줄 출력
--head 2 : 로그의 처음부터 2줄 출력
--sinse : 유닉스 시간을 입력해 특정 시간 이후 로그 기록
-f : 로그의 스트림 출력
-t : 로그의 타임 스탬프
--log-opt --max-size : 로그파일의 사이즈 지정
--log-opt --max-file : 로그 파일의 개수 지정
--log-driver : 로그 드라이버 지정 가능 (default = json)


로그 드라이버의 종류

  • syslog
  • journald
  • fluentd
  • awslogs

Syslog

기본적으로 로컬 호스트의 syslog에 저장되며 OS 마다 syslog의 위치가 상이하다.

  • Debian 계열 : /var/log/syslog
  • Redhat 계열 : /var/log/messages
  • Ubuntu 16.04 & coreOS : journalctl -u docker.service
    Syslog를 외부서버에 설치해 로그를 외부로도 보낼 수 있다. 그 방법으로는 `rsyslog`를 써서 중앙 컨테이너로 로그를 저장하는 예시를 아래에서 보자. 서버, 클라이언트 총 2개의 가상머신이 있다고 가정한다.

서버에서 rsyslog 컨테이너 생성

$ docker run -it -h rsyslog --nama LogContainer -p 514:514 -p 514:514/udp centos:latest

서버의 rsyslog 컨테이너 내부에 rsyslog.conf 파일의 syslog 서버를 구동시키는 옵션 주석해제

$ vi /etc/rsyslog.conf

#Provides UDP syslog reception
$ModLoad imudp
$UDPServer Run 514

:wq

# rsyslog 재기동
$ service rsyslog restart

클라이언트에서 로그 컨테이너 생성과 동시에 서버의 로그 컨테이너와 태그 지정

태그는 로그가 생성될 때 함께 저장될 태그이며 로그를 분류하는데에 좋다.

$ docker run -it \
$ --log-driver=syslog \
$ --log-opt syslog-address=tcp://{Server-IP}:514 \
$ --log-opt tag="LogContainer" \
$ centos:latest

서버에서 syslog 파일 확인을 하면 로그가 전송된 것을 알 수 있다.

$ tail /var/log/syslog

--log-opt syslog-facillity를 사용하면 로그가 저장될 파일도 바꿀수 있다.
facillity는 로그를 생성하는 주체에 따라 로그를 다르게 저장하는 것으로, 여러 어플리케이션에서 수집되는 로그를 분류하는 방법이다.


기본적으로 daemon으로 설정되어 있지만

  • kern
  • user
  • mail
    등 다른 facillity를 사용할 수 있다.
    facillity 옵션을 쓰면 rsyslog 컨테이너 내부에 facillity 별로 로그파일이 따로 생성된다.

fluentd

각종 로그를 수집하고 저장하는 오픈소스 도구로서,
도커 엔진 기반 컨테이너의 로그를 fluentd를 통해 저장할 수 있도록 공식적으로 제공하는 플러그인이다.


fluentd의 데이터 포맷도 json이며 수집되는 데이터를 AWS, S3, HDFS, MongoDB등 다양한 곳에 저장할 수 있다.


다음 예시는 fluentd와 MongoDB를 연동해 데이터를 저장하는 방법을 보여준다.
Docker Server -> fluentd -> MongoDB 의 Flow이며, 각각의 가상머신이 있다고 가정한다.


MongoDB 머신에서 MongoDB 컨테이너 생성

$ docker run -d --name MongoContainer -p 27017:27017 mongo:latest

fluentd 머신의 로컬에 다음 내용을 저장한다.

<source>
  @type forward
</source>

<match docker.**>
  @type mongo
  database nginx
  collection access
  host {MongoDB-Server-IP}
  port 27017
  flush_interval 10a
  user root
  password password

fluentd 컨테이너 생성

$ docker run -d --name FluentdContainer -p 24224:24224 \
$ -v ${pwd}/fluentd.conf:/fluentd/etc/fluent.conf \
$ -e FLUENTD_CONF=fluent.conf \
$ fluentd:latest