Journald 로깅 드라이버

Journald 로깅 드라이버 (Journald logging driver)

journald 로깅 드라이버는 컨테이너 로그를 systemd journal로 보내요. 로그 항목은 journalctl 명령, journal API 사용, 또는 docker logs 명령으로 검색할 수 있어요.

로그 메시지 자체의 텍스트 외에도 journald 로그 드라이버는 각 메시지와 함께 다음 메타데이터를 journal에 저장해요:

Field Description
CONTAINER_ID 12자로 잘린 컨테이너 ID.
CONTAINER_ID_FULL 전체 64자 컨테이너 ID.
CONTAINER_NAME 시작된 시점의 컨테이너 이름. docker rename으로 컨테이너 이름을 바꾸면 새 이름이 journal 항목에 반영되지 않아요.
CONTAINER_TAG, SYSLOG_IDENTIFIER 컨테이너 태그 (log tag option documentation).
CONTAINER_PARTIAL_MESSAGE 로그 무결성을 표시하는 필드. 긴 로그 줄의 로깅을 개선해요.
IMAGE_NAME 컨테이너 이미지의 이름.

출처: 문서

본문

사용법 (Usage)

journald 드라이버를 기본 로깅 드라이버로 사용하려면 daemon.json 파일에서 log-driverlog-opts 키를 적절한 값으로 설정해요. daemon.json으로 Docker를 구성하는 것에 대한 자세한 내용은 daemon.json을 참고하세요.

Note Docker Desktop을 사용한다면 Docker Desktop Dashboard를 통해 데몬 구성을 편집해요. Settings를 열고 Docker Engine을 선택해요. 자세한 내용은 Docker Engine 설정을 참고하세요.

다음 예시는 로그 드라이버를 journald로 설정해요:

{
  "log-driver": "journald"
}

변경 사항을 적용하려면 Docker를 재시작해요.

특정 컨테이너의 로깅 드라이버를 구성하려면 docker run 명령의 --log-driver 플래그를 사용해요.

$ docker run --log-driver=journald ...

옵션 (Options)

--log-opt NAME=VALUE 플래그를 사용해 추가 journald 로깅 드라이버 옵션을 지정해요.

Option Required Description
tag optional journald 로그에서 CONTAINER_TAGSYSLOG_IDENTIFIER 값을 설정할 템플릿 지정. 로그 태그 형식 사용자 지정은 log tag option documentation 참고.
labels optional 컨테이너에 지정된 경우 메시지에 포함해야 하는 라벨 키의 쉼표 구분 목록.
labels-regex optional labels와 유사하고 호환됨. 로깅 관련 라벨을 일치시키는 정규식. 고급 log tag options에서 사용.
env optional 컨테이너에 지정된 경우 메시지에 포함해야 하는 환경 변수 키의 쉼표 구분 목록.
env-regex optional env와 유사하고 호환됨. 로깅 관련 환경 변수를 일치시키는 정규식. 고급 log tag options에서 사용.

labelenv 옵션 사이에 충돌이 발생하면 env 값이 우선해요. 각 옵션은 로깅 메시지의 속성에 추가 필드를 더해요.

다음은 journald에 로그하는 데 필요한 로깅 옵션의 예시예요.

$ docker run \
    --log-driver=journald \
    --log-opt labels=location \
    --log-opt env=TEST \
    --env "TEST=false" \
    --label location=west \
    your/application

이 구성은 또한 드라이버가 페이로드에 라벨 location과 환경 변수 TEST를 포함하도록 지시해요. --env "TEST=false" 또는 --label location=west 인자를 생략하면 해당 키가 journald 로그에 설정되지 않아요.

컨테이너 이름 관련 참고 사항 (Note regarding container names)

CONTAINER_NAME 필드에 기록되는 값은 시작 시 설정된 컨테이너의 이름이에요. docker rename으로 컨테이너 이름을 바꾸면 새 이름이 journal 항목에 반영되지 않아요. Journal 항목은 원래 이름을 계속 사용해요.

journalctl로 로그 메시지 검색 (Retrieve log messages with journalctl)

journalctl 명령을 사용해 로그 메시지를 검색해요. 필터 표현식을 적용해 검색된 메시지를 특정 컨테이너와 연관된 것으로 제한할 수 있어요:

$ sudo journalctl CONTAINER_NAME=webserver

추가 필터를 사용해 검색된 메시지를 더 제한할 수 있어요. -b 플래그는 마지막 시스템 부팅 이후 생성된 메시지만 검색해요:

$ sudo journalctl -b CONTAINER_NAME=webserver

-o 플래그는 검색된 로그 메시지의 형식을 지정해요. -o json을 사용해 로그 메시지를 JSON 형식으로 반환해요.

$ sudo journalctl -o json CONTAINER_NAME=webserver

TTY가 활성화된 컨테이너의 로그 보기 (View logs for a container with a TTY enabled)

컨테이너에서 TTY가 활성화되어 있으면 로그 메시지를 검색할 때 출력에서 [10B blob data]가 보일 수 있어요. 그 이유는 줄 끝에 \r이 추가되는데 --all이 설정되지 않는 한 journalctl이 자동으로 그것을 제거하지 않기 때문이에요:

$ sudo journalctl -b CONTAINER_NAME=webserver --all

journal API로 로그 메시지 검색 (Retrieve log messages with the journal API)

이 예시는 systemd Python 모듈을 사용해 컨테이너 로그를 검색해요:

import systemd.journal

reader = systemd.journal.Reader()
reader.add_match('CONTAINER_NAME=web')

for msg in reader:
    print('{CONTAINER_ID_FULL}: {MESSAGE}'.format(**msg))

더 알아보기 (Learn more)