23.10. 저널 사용
journal는 로그 파일을 보고 관리해야 하는 systemd 의 구성 요소입니다. 병렬로 사용하거나 rsyslogd
와 같은 기존 syslog 데몬 대신 사용할 수 있습니다. journal는 기존 로깅과 관련된 문제를 해결하기 위해 개발되었습니다. 나머지 시스템과 밀접하게 통합되어 로그 파일에 대한 다양한 로깅 기술 및 액세스 관리를 지원합니다.
로깅 데이터는 저널의 journald
서비스에서 수집, 저장 및 처리합니다. 또한 사용자 프로세스에서 표준 출력, 시스템 서비스의 표준 오류 출력 또는 네이티브 API를 통해 커널에서 수신한 로깅 정보를 기반으로 저널 이라는 바이너리 파일을 생성하고 유지 관리합니다. 이러한 저널은 상대적으로 빠른 검색 시간을 제공하는 구조화되고 인덱싱됩니다. 비트맵 항목은 고유 식별자를 포함할 수 있습니다. journald
서비스는 각 로그 메시지에 대해 수많은 메타 데이터 필드를 수집합니다. 실제 저널 파일은 보호되므로 수동으로 편집할 수 없습니다.
23.10.1. 로그 파일 보기
저널 로그에 액세스하려면 journalctl 툴을 사용합니다. 로그 유형의 기본 보기를 root
로 보려면 다음을 수행합니다.
journalctl
이 명령의 출력은 시스템 구성 요소 및 사용자가 생성한 메시지를 포함하여 시스템에서 생성된 모든 로그 파일의 목록입니다. 이 출력 구조는 /var/log/message/
에서 사용되는 출력 구조와 유사하지만 특정 개선 사항이 적용됩니다.
- 항목의 우선 순위는 시각적으로 표시됩니다. 오류 우선 순위 이상의 라인은 빨간색 색상으로 강조 표시되며, 알림 및 경고 우선 순위가 있는 줄에 굵은 글꼴이 사용됩니다.
- 타임스탬프는 시스템의 현지 표준 시간대에 대해 변환됨
- 순환된 로그를 포함하여 기록된 모든 데이터가 표시됩니다.
- 부팅 시작 시 특수 줄로 태그가 지정됩니다.
예 23.18. journalctl 출력 예
다음은 journalctl 툴에서 제공하는 출력 예입니다. 매개 변수 없이 호출하면 나열된 항목이 타임스탬프로 시작한 다음 작업을 수행한 호스트 이름과 애플리케이션과 실제 메시지가 표시됩니다. 이 예에서는 저널 로그의 처음 세 개의 항목을 보여줍니다.
# journalctl -- Logs begin at Thu 2013-08-01 15:42:12 CEST, end at Thu 2013-08-01 15:48:48 CEST. -- Aug 01 15:42:12 localhost systemd-journal[54]: Allowing runtime journal files to grow to 49.7M. Aug 01 15:42:12 localhost kernel: Initializing cgroup subsys cpuset Aug 01 15:42:12 localhost kernel: Initializing cgroup subsys cpu [...]
대부분의 경우 저널 로그의 최신 항목만 관련이 있습니다. journalctl
출력을 줄이는 가장 간단한 방법은 가장 최근의 로그 항목 수만 나열하는 -n
옵션을 사용하는 것입니다.
journalctl
-n
Number
Number 를 표시할 행 수로 바꿉니다. 번호를 지정하지 않으면 journalctl
에서 최근 10개의 항목을 표시합니다.
journalctl
명령을 사용하면 다음 구문으로 출력 형식을 제어할 수 있습니다.
journalctl
-o
form
원하는 출력 형식을 지정하는 키워드로 양식을 교체합니다. 모든 필드가 있는 전체 구조 항목 항목을 반환하는 verbose
, export
, 백업 및 네트워크 전송에 적합한 바이너리 스트림을 생성하는 json 및 JSON 데이터 구조로 항목을 포맷하는 json
과 같은 몇 가지 옵션이 있습니다. 전체 키워드 목록은 journalctl(1)
매뉴얼 페이지를 참조하십시오.
예 23.19. 자세한 journalctl 출력
모든 항목에 대한 전체 메타 데이터를 보려면 다음을 입력합니다.
# journalctl -o verbose [...] Fri 2013-08-02 14:41:22 CEST [s=e1021ca1b81e4fc688fad6a3ea21d35b;i=55c;b=78c81449c920439da57da7bd5c56a770;m=27cc _BOOT_ID=78c81449c920439da57da7bd5c56a770 PRIORITY=5 SYSLOG_FACILITY=3 _TRANSPORT=syslog _MACHINE_ID=69d27b356a94476da859461d3a3bc6fd _HOSTNAME=localhost.localdomain _PID=562 _COMM=dbus-daemon _EXE=/usr/bin/dbus-daemon _CMDLINE=/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation _SYSTEMD_CGROUP=/system/dbus.service _SYSTEMD_UNIT=dbus.service SYSLOG_IDENTIFIER=dbus SYSLOG_PID=562 _UID=81 _GID=81 _SELINUX_CONTEXT=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 MESSAGE=[system] Successfully activated service 'net.reactivated.Fprint' _SOURCE_REALTIME_TIMESTAMP=1375447282839181 [...]
이 예에서는 단일 로그 항목을 식별하는 필드를 나열합니다. 이러한 메타 데이터는 “고급 필터링” 에 표시된 대로 메시지 필터링에 사용할 수 있습니다. 가능한 모든 필드에 대한 전체 설명은 systemd.journal-fields(7)
매뉴얼 페이지를 참조하십시오.
23.10.2. 액세스 제어
기본적으로 루트
권한이 없는 journal 사용자는 해당 사용자가 생성한 로그 파일만 볼 수 있습니다. 시스템 관리자는 선택한 사용자를 adm 그룹에 추가하여 전체 로그 파일에 대한 액세스 권한을 부여할 수 있습니다. 이 작업을 수행하려면 root
로 입력합니다.
usermod
-a
-G
adm username
여기서 username 을 adm 그룹에 추가할 사용자의 이름으로 바꿉니다. 그런 다음 이 사용자는 journalctl
명령의 루트 사용자와 동일한 출력을 수신합니다. 액세스 제어는 저널에 영구 스토리지가 활성화된 경우에만 작동합니다.
23.10.3. 라이브 보기 사용
매개 변수 없이 호출하면 journalctl
에서 수집된 가장 오래된 항목 목록부터 전체 항목 목록을 표시합니다. 실시간 보기를 사용하면 새 항목이 표시되는 대로 지속적으로 출력되므로 로그 메시지를 실시간으로 모니터링할 수 있습니다. 라이브 보기 모드에서 journalctl 을 시작하려면 다음을 입력합니다.
journalctl
-f
이 명령은 현재 10개 이상의 로그 행 목록을 반환합니다. 그런 다음 journalctl 유틸리티가 계속 실행되고 새 변경 사항이 즉시 표시될 때까지 기다립니다.
23.10.4. 메시지 필터링
매개 변수 없이 실행되는 journalctl
명령의 출력은 종종 광범위하므로 다양한 필터링 방법을 사용하여 정보를 추출하여 요구 사항을 충족할 수 있습니다.
우선 순위로 필터링
로그 메시지는 종종 시스템에서 잘못된 동작을 추적하는 데 사용됩니다. 우선 순위가 선택된 항목만 보려면 다음 구문을 사용하십시오.
journalctl
-p
priority
여기에서 priority 를 다음 키워드(또는 숫자와 함께) 중 하나로 교체합니다. debug
(또는 number): debug (7), info
(6), notice
(5), warning
(4), err
(3), crit
(2), alert
(1), emerg
(0)
예 23.20. 우선 순위로 필터링
오류 또는 높은 우선 순위가 있는 항목만 보려면 다음을 사용하십시오.
journalctl
-p err
시간별 필터링
현재 부팅에서만 로그 항목을 보려면 다음을 입력합니다.
journalctl
-b
시스템을 즉시 재부팅하는 경우 -b
는 journalctl
의 출력을 크게 줄어들지 않습니다. 이러한 경우 시간 기반 필터링이 더 유용합니다.
journalctl
--since
=value--until
=value
--since
및 --until
을 사용하면 지정된 시간 범위 내에서 생성된 로그 메시지만 볼 수 있습니다. 다음 예와 같이 날짜 또는 시간 또는 둘 다 형식으로 이러한 옵션에 값을 전달할 수 있습니다.
예 23.21. 시간 및 우선 순위별 필터링
필터링 옵션을 결합하여 특정 요청에 따라 결과 집합을 줄일 수 있습니다. 예를 들어 특정 시점의 경고 또는 상위 우선 순위 메시지를 보려면 다음을 입력합니다.
journalctl
-p warning
--since="2013-3-16 23:59:59"
고급 필터링
예 23.19. “자세한 journalctl 출력” 로그 항목을 지정하고 필터링에 사용할 수 있는 필드 집합을 나열합니다. systemd
가 저장할 수 있는 메타 데이터에 대한 전체 설명은 systemd.journal-fields(7)
매뉴얼 페이지를 참조하십시오. 이 메타 데이터는 사용자 개입 없이 각 로그 메시지에 대해 수집됩니다. 값은 일반적으로 텍스트 기반이지만 바이너리와 큰 값을 사용할 수 있습니다. 필드에는 값이 매우 일반적이더라도 여러 값이 할당될 수 있습니다.
지정된 필드에서 발생하는 고유 값 목록을 보려면 다음 구문을 사용합니다.
journalctl
-F
fieldname
필드 이름을 관심 있는 필드의 이름으로 바꿉니다.
특정 조건에 맞는 로그 항목만 표시하려면 다음 구문을 사용합니다.
journalctl
fieldname=value
fieldname 을 필드의 이름과 value 를 해당 필드에 포함된 특정 값으로 바꿉니다. 결과적으로 이 조건과 일치하는 행만 반환됩니다.
systemd
에 의해 저장된 메타 데이터 필드의 수가 매우 크기 때문에 관심 필드의 정확한 이름을 쉽게 잊어버릴 수 있습니다. 확실하지 않은 경우 type:
journalctl
Tab 키를 두 번 누릅니다. 이는 사용 가능한 필드 이름 목록을 보여줍니다. 컨텍스트를 기반으로 하는 탭 완료는 필드 이름에 따라 작동하므로 필드 이름에서 고유한 문자 집합을 입력한 다음 탭을 눌러 이름을 자동으로 완료할 수 있습니다. 마찬가지로 필드에서 고유한 값을 나열할 수 있습니다. 유형:
journalctl
fieldname=
Tab 을 두 번 누릅니다. journalctl
-F
필드 이름 대신 사용됩니다.
하나의 필드에 여러 값을 지정할 수 있습니다.
journalctl
fieldname=value1 fieldname=value2 ...
동일한 필드에 두 일치를 지정하면 일치 항목의 논리 OR
조합이 생성됩니다. value1 또는 value2 와 일치하는 항목이 표시됩니다.
또한 출력 세트를 추가로 줄이기 위해 여러 필드-값 쌍을 지정할 수 있습니다.
journalctl
fieldname1=value fieldname2=value ...
서로 다른 필드 이름에 대한 일치 항목이 지정된 경우 논리 AND
와 결합됩니다. 항목이 둘 다 표시되어야 합니다.
+ 기호를 사용하면 여러 필드에 대해 일치하는 논리 OR
조합을 설정할 수 있습니다.
journalctl fieldname1=value + fieldname2=value ...
이 명령은 두 조건과 일치하는 조건 중 하나와 일치하는 항목을 반환합니다.
예 23.22. 고급 필터링
UID 70이 있는 사용자에게 avahi-daemon.service
또는 crond.service
에서 생성한 항목을 표시하려면 다음 명령을 사용합니다.
journalctl_UID=70
_SYSTEMD_UNIT=avahi-daemon.service
_SYSTEMD_UNIT=crond.service
_SYSTEMD_UNIT
필드에 두 개의 값이 설정되어 있으므로 모두 _UID=70
조건과 일치하는 경우에만 표시됩니다. 이것은 다음과 같이 표현될 수 있습니다: (UID=70 및 (avahi 또는 cron)).
선택한 로그 항목 그룹의 최신 변경 사항을 추적하려면 앞서 언급한 필터링을 라이브 뷰 모드에서도 적용할 수 있습니다.
journalctl
-f
fieldname=value ...
23.10.5. 영구 스토리지 활성화
기본적으로 journal 는 로그 파일을 메모리 또는 /run/log/journal/
디렉터리의 작은 링 버퍼에 저장합니다. journalctl
을 사용하여 최근 로그 기록을 표시하기에 충분합니다. 이 디렉터리는 volatile이므로 로그 데이터가 영구적으로 저장되지 않습니다. 기본 구성으로 syslog는 저널 로그를 읽고 /var/log/
디렉터리에 저장합니다. 영구 로깅이 활성화되면 저널 파일은 /var/log/journal
에 저장되어 재부팅 후에도 지속됩니다. 그런 다음 journal는 일부 사용자에 대해 rsyslog 를 교체 할 수 있습니다 (하지만 장 소개 참조).
활성화된 영구 스토리지는 다음과 같은 이점이 있습니다.
- 더 많은 기간에 문제 해결을 위해 풍부한 데이터가 기록됩니다.
- 즉각적인 문제 해결을 위해 재부팅 후 풍부한 데이터를 사용할 수 있습니다.
- 서버 콘솔은 현재 로그 파일이 아닌 저널에서 데이터를 읽습니다.
영구 스토리지에는 다음과 같은 몇 가지 단점도 있습니다.
- 영구 스토리지에서 저장된 데이터 양은 여유 메모리에 따라 달라지지만 특정 시간 범위를 커버할 보장은 없습니다.
- 로그에 더 많은 디스크 공간이 필요합니다.
journal에 대한 영구 스토리지를 활성화하려면 다음 예와 같이 저널 디렉터리를 수동으로 생성합니다. 루트
유형으로 다음과 같습니다.
mkdir
-p
/var/log/journal/
그런 다음 journald
를 다시 시작하여 변경 사항을 적용합니다.
systemctl
restart
systemd-journald