컨테이너 로깅
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 파일은 /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
주석 제거
vim /etc/rsyslog.conf
service rsyslog restart
- Ctrl + P + Q
docker inspect rsyslog_container
결과
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 컨테이너의 주소(방금 찾은 컨테이너 주소)
root@8025ff815a2e:/# echo "this is syslog container"
this is syslog container
- Ctrl + P + Q
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 |
블로그의 정보
코딩무비
코딩무비