코딩무비

컨테이너 로깅

by 코딩무비
반응형

1. json-file 로그 

 

컨테이너 내부에서 어떤 일이 일어나는지 체크하는 것은 중요합니다.

컨테이너의 표준 출력(StdOut)과 에러(StdERr) 로그를 별도의 메타데이터 파일로 저장하며 이를 확인하는 명령어 제공

 

mysql 컨테이너 실행(생성)

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

 mysql 컨테이너 로그 확인

컨테이너 로그는 docker logs 명령어를 통해 컨테이너의 표준 출력을 확인할 수 있습니다.

 

docker logs mysql

결과

2022-03-25 06:04:31+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.37-1debian10 started.
2022-03-25 06:04:31+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2022-03-25 06:04:31+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.37-1debian10 started.
2022-03-25 06:04:31+00:00 [Note] [Entrypoint]: Initializing database files
2022-03-25T06:04:31.557204Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
생략....

 

동일한 mysql 컨테이너 생성(-e 옵션 제외)

docker run -d --name no_passwd_mysql mysql:5.7

컨테이너 목록 확인

docker ps

결과

CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                 NAMES
d7317afcd940   mysql:5.7   "docker-entrypoint.s…"   7 minutes ago   Up 7 minutes   3306/tcp, 33060/tcp   mysql

 

새로 만든 컨테이너는 실행되지 않았습니다.

docker logs을 통하여 무슨 문제가 있는지 확인

docker logs no_passwd_mysql

결과

2022-03-25 06:12:22+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.37-1debian10 started.
2022-03-25 06:12:22+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2022-03-25 06:12:22+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.37-1debian10 started.
2022-03-25 06:12:22+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
    You need to specify one of the following:
    - MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD

--tail 명령어로 마지막 로그줄의 N번째부터 읽을 수 있음

--since 옵션에 유닉스 시간을 입력하여 특정 시간 이후의 로그를 확인할 수 있음

 

 

도커 컨테이너 로그는 /var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.logs에서 확인 할 수 있습니다.

로그는 다음과 같이 json 형태인 것을 확인할 수 있습니다.

{"log":"\u001b]0;root@221ec4ae2fea: /\u0007root@221ec4ae2fea:/# echo test!\r\n","stream":"stdout","time":"2022-03-25T06:53:07.562472384Z"}
{"log":"test!\r\n","stream":"stdout","time":"2022-03-25T06:53:07.562523093Z"}
{"log":"\u001b]0;root@221ec4ae2fea: /\u0007root@221ec4ae2fea:/# docker lo\r\u001b[K\u001b]0;root@221ec4ae2fea: /\u0007root@221ec4ae2fea:/# docker lo\r\u001b[K\u001b]0;root@221ec4ae2fea: /\u0007root@221ec4ae2fea:/# docker lo\u0008 \u0008\u0008 \u0008\u0008 \u0008\u0008 \u0008\u0008 \u0008\u0008 \u0008\u0008 \u0008\u0008 \u0008\u0008 \u0008\u0007\u0007\u0007\u0007\u0007\u0007\r\n","stream":"stdout","time":"2022-03-25T06:53:43.541742771Z"}
{"log":"\u001b]0;root@221ec4ae2fea: /\u0007root@221ec4ae2fea:/# \r\n","stream":"stdout","time":"2022-03-25T06:53:43.69544115Z"}
{"log":"\u001b]0;root@221ec4ae2fea: /\u0007root@221ec4ae2fea:/# hi\r\n","stream":"stdout","time":"2022-03-25T06:53:44.289755344Z"}

 

 

 

2. syslog 로그 

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

syslog
  • 유닉스 계열 운영체제에서 로그를 수집하는 오래된 표준 중 하나
  • 커널,보안 등 시스템과 관련된 로그, 애플리케이션의 로그 등 다양한 종류의 로그 수집 저장

 

 

우분투에서는 syslog 파일은 /var/log/syslog에 있습니다.

 

컨테이너 내부의 출략이 많은 경우 json 파일의 크기가 커질 수 있기 때문에

--log-opt 옵션으로 컨테이너 json 로그 최대 크기를 제한할 수 있습니다.

docker run -it \
--log-opt max-size=10k --log-opt max-file=3 \
--name log-test ubuntu:18.04

최대 크기 10K이고 파일을 3개까지 로그를 남길 수 있습니다.

 

 

2. syslog 확인

tail /var/log/syslog


결과:

Mar 25 07:26:51 ip-172-31-7-74 5ae70313cb4e[936]: syslogtest
Mar 25 07:26:51 ip-172-31-7-74 dockerd[936]: time="2022-03-25T07:26:51.638751546Z" level=info msg="ignoring event"   c

syslog에 syslogtest가 기록된 것을 확인할 수 있습니다.

 

rsyslog

이번에는 syslog을 원격으로 저장하는 방법에 대하여 알아봅시다.

* 기존에는 2개의 호스트로 구현하나 프리티어 계정을 이용하여 1개의 호스트로 해보겠습니다.

 

 

rsyslog 컨테이너를 생성해 봅시다

컨테이너 생성
docker run -it \
-h rsyslog \
--name rsyslog_server \
-p 514:514 -p 514:514/udp \
ubuntu:14.04
rsyslog.conf 파일
주석 제거
 vim /etc/rsyslog.conf
rsyslog 서비스 재시작
 service rsyslog restart
컨테이너 빠져나오기
  • Ctrl + P + Q
컨테이너 ip 확인
docker inspect rsyslog_container

결과

 

syslog 컨테이너

 

syslog 컨테이너를 생성
docker run -it \
--log-driver=syslog \
--log-opt syslog-address=tcp://172.17.0.4:514 \
--log-opt tag="mylog" \
ubuntu:14.04

--log-opt : 로깅 드라이버에 추가할 옵션

syslog-address : syslog 컨테이너의 주소(방금 찾은 컨테이너 주소)

echo 명령어 실행
root@8025ff815a2e:/# echo "this is syslog container"
this is syslog container
컨테이너 빠져 나오기
  • Ctrl + P + Q
 

 

 

 

rsyslog 컨테이너에 로그가 작성되었는지 확인해봅시다

rsyslog 컨테이너에 들어가기
docker attach rsyslog_container
로그 확인

 

tail /var/log/syslog
실행 결과

마지막에 this is syslog container 가 적힌 것을 확인할 수 있습니다. 뿐만 아니라 로그 앞에 mylog라는 명칭이 적혀있는 것을 확인할 수 있습니다.

 

 

 

부록))

--log-opt 옵션으로 syslog-facility을 이용하여 로그 저장 파일을 바꿀 수 있습니다.

docker run -it \
--log-driver syslog \
--log-opt syslog-address=tcp://172.17.0.4:514 \
--log-opt tag='maillog' \
--log-opt syslog-facility='mail' \
ubuntu:14.04

echo 명령어를 실행해봅시다

root@2af4628a99f4:/# echo mail test

컨테이너를 빠져나오고  rsyslog 컨테이너에 들어가 확인해봅시다

 docker attach rsyslog_server

 

mail 로그파일의 생성여부와 파일 내부를 확인해봅시다.

ls /var/log

결과

mail 로그파일이 생성된 것을 확인할 수 있습니다.

mail.log을 확인해봅시다

root@rsyslog:/var/log# cat mail.log
Mar 30 01:55:53 ip-172-17-0-1.ap-northeast-2.compute.internal maillog[936]: #033]0;root@2af4628a99f4: /#007root@2af4628a99f4:/# #015#033[K#033]0;root@2af4628a99f4: /#007root@2af4628a99f4:/# ehco#010 #010#010 #010#010 #010ch #010 #010o mail test#015
Mar 30 01:55:53 ip-172-17-0-1.ap-northeast-2.compute.internal maillog[936]: mail test#015

mail test 메시지가 생성된 것을 확인해볼 수 있습니다.

 

 

 

컨테이너 로그 파일은 어떤 것들이 있는 지,

외부 syslog은 어떻게 연결하는 지,

로그가 저장될 파일 이름 변경 등을 배워봤습니다 !

 

출처

 

시작하세요! 도커/쿠버네티스

반응형

'도커' 카테고리의 다른 글

[도커] 도커 이미지  (5) 2022.05.12
aws cloudwatch  (5) 2022.04.14
[Docker] 4. 도커 네트워크  (8) 2022.03.24
3. 컨테이너 애플리케이션 구축  (4) 2022.03.22
2. 이미지, 컨테이너  (4) 2022.03.21

블로그의 정보

코딩무비

코딩무비

활동하기