웹사이트 검색

Journalctl을 사용하여 Systemd에서 로그 메시지 관리 [종합 안내서]


Systemd는 Linux 시스템을 위한 최첨단 시스템 및 서비스 관리자로, 시스템 부팅 시 프로세스를 병렬로 시작하기 위한 init 데몬 대체품입니다. 이제 Fedora, Debian, Ubuntu, OpenSuSE, Arch, RHEL, CentOS 등을 포함한 다양한 현재 주류 배포판에서 지원됩니다.

앞서 'init'과 'systemd'에 대한 이야기를 설명했습니다. 여기서 우리는 두 개의 데몬이 무엇인지, 'init'을 기술적으로 'systemd'로 대체해야 하는 이유와 systemd의 주요 기능에 대해 논의했습니다.

다른 일반적인 init 시스템에 비해 systemd의 주요 장점 중 하나는 저널을 사용하여 시스템 및 프로세스 로깅의 중앙 집중식 관리를 지원한다는 것입니다. 이번 글에서는 Linux에서 journalctl 명령어를 사용하여 systemd에서 로그 메시지를 관리하고 보는 방법을 알아봅니다.

중요: 이 가이드를 계속 진행하기 전에 'Systemctl' 명령을 사용하여 'Systemd' 서비스 및 장치를 관리하는 방법을 배우고 새 서비스를 만들고 실행하는 방법도 알아볼 수 있습니다. Linux에서 쉘 스크립트를 사용하는 systemd의 서비스 단위. 그러나 위의 내용이 모두 괜찮다면 계속해서 읽어보세요.

Systemd에서 로그 메시지를 수집하기 위해 Journald 구성

저널드는 전체 시스템에서 저널 항목을 수집하고 작성하는 데몬입니다. 이는 본질적으로 부팅 메시지, 커널 및 syslog 또는 다양한 응용 프로그램의 메시지이며 모든 메시지를 중앙 위치인 저널 파일에 저장합니다.

컴파일 시간에 생성되는 기본 구성 파일인 /etc/systemd/journald.conf를 통해 journald의 동작을 제어할 수 있습니다. 이 파일에는 로컬 환경 요구 사항에 맞게 값을 변경할 수 있는 옵션이 포함되어 있습니다.

다음은 cat 명령을 사용하여 본 파일 모양의 샘플입니다.

cat /etc/systemd/journald.conf 
See journald.conf(5) for details.

[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg

다양한 패키지 설치 및 사용 구성은 /usr/lib/systemd/*.conf.d/에서 추출되며 런타임 구성은 /run/systemd/journald.conf에서 찾을 수 있습니다. d/*.conf 반드시 사용할 필요는 없습니다.

디스크에 저널 데이터 저장소 활성화

Ubuntu 및 Linux Mint와 같은 파생 버전을 포함한 다수의 Linux 배포판은 기본적으로 디스크에 부팅 메시지를 영구적으로 저장하는 기능을 활성화하지 않습니다.

아래와 같이 '저장소' 옵션을 '영구'로 설정하면 이를 활성화할 수 있습니다. 그러면 /var/log/journal 디렉터리가 생성되고 모든 저널 파일이 그 아래에 저장됩니다.

sudo vi /etc/systemd/journald.conf 
OR
sudo nano /etc/systemd/journald.conf 
[Journal]
Storage=persistent

추가 설정의 경우 “[저널]” 섹션에 구성되어야 하는 모든 옵션의 의미를 입력하여 찾아보세요.

man journald.conf

Timedatectl 명령을 사용하여 올바른 시스템 시간 설정

Journald 서비스를 사용하는 systemd에서 안정적인 로그 관리를 위해 시간대를 포함한 시간 설정이 시스템에서 올바른지 확인하십시오.

시스템의 현재 날짜 및 시간 설정을 보려면 다음을 입력하십시오.

timedatectl 
OR
timedatectl status

Local time: Thu 2017-06-15 13:29:09 EAT
Universal time: Thu 2017-06-15 10:29:09 UTC
RTC time: Thu 2017-06-15 10:29:09
Time zone: Africa/Kampala (EAT, +0300)
Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

올바른 시간대와 시스템 시간을 설정하려면 아래 명령을 사용하십시오.

sudo timedatectl set-timezone  Africa/Kampala
sudo timedatectl set-time “13:50:00”

Journalctl 명령을 사용하여 로그 메시지 보기

journalctl은 시스템 저널(저널 서비스로 작성된)의 내용을 보는 데 사용되는 유틸리티입니다.

필터링 없이 수집된 모든 로그를 표시하려면 다음을 입력합니다.

journalctl
-- Logs begin at Wed 2017-06-14 21:56:43 EAT, end at Thu 2017-06-15 12:28:19 EAT
Jun 14 21:56:43 tecmint systemd-journald[336]: Runtime journal (/run/log/journal
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuset
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpu
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuacct
Jun 14 21:56:43 tecmint kernel: Linux version 4.4.0-21-generic (buildd@lgw01-21)
Jun 14 21:56:43 tecmint kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-
Jun 14 21:56:43 tecmint kernel: KERNEL supported cpus:
Jun 14 21:56:43 tecmint kernel:   Intel GenuineIntel
Jun 14 21:56:43 tecmint kernel:   AMD AuthenticAMD
Jun 14 21:56:43 tecmint kernel:   Centaur CentaurHauls
Jun 14 21:56:43 tecmint kernel: x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x01: 'x87 flo
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x02: 'SSE reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x04: 'AVX reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Enabled xstate features 0x7, context si
Jun 14 21:56:43 tecmint kernel: x86/fpu: Using 'eager' FPU context switches.
Jun 14 21:56:43 tecmint kernel: e820: BIOS-provided physical RAM map:
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000000000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000090000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000100000-0x000000001ff
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020000000-0x00000000201
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020200000-0x00000000400

부츠를 기준으로 로그 메시지 보기

--list-boots 옵션을 사용하면 부팅 번호(현재 부팅 기준) 목록, 해당 ID, 부팅에 해당하는 첫 번째 및 마지막 메시지의 타임스탬프를 표시할 수 있습니다.

journalctl --list-boots

-1 9fb590b48e1242f58c2579defdbbddc9 Thu 2017-06-15 16:43:36 EAT—Thu 2017-06-15 1
 0 464ae35c6e264a4ca087949936be434a Thu 2017-06-15 16:47:36 EAT—Thu 2017-06-15 1 

현재 부팅(번호 0)에서 저널 항목을 보려면 이와 같이 -b 스위치를 사용하십시오(위의 샘플 출력과 동일).

journalctl -b

이전 부팅의 저널을 보려면 아래와 같이 -b 옵션과 함께 -1 상대 포인터를 사용하십시오.

journalctl -b -1

또는 이와 같이 부팅 ID를 사용하십시오.

journalctl -b 9fb590b48e1242f58c2579defdbbddc9

시간을 기준으로 로그 메시지 필터링

UTC(협정 세계시) 형식으로 시간을 사용하려면 다음과 같이 --utc 옵션을 추가하세요.

journalctl --utc

특정 날짜 및 시간 이후의 모든 항목을 보려면 다음과 같이 하십시오. 2017년 6월 15일 오전 8시 15분에 다음 명령을 입력하세요.

journalctl --since "2017-06-15 08:15:00"
journalctl --since today
journalctl --since yesterday

최근 로그 메시지 보기

최근 로그 메시지(기본적으로 10개)를 보려면 아래와 같이 -n 플래그를 사용하십시오.

journalctl -n
journalctl -n 20 

커널에서 생성된 로그 메시지 보기

dmesg 명령 출력과 유사한 커널 메시지만 보려면 -k 플래그를 사용할 수 있습니다.

journalctl -k 
journalctl -k -b 
journalctl -k -b 9fb590b48e1242f58c2579defdbbddc9

장치별로 생성된 로그 메시지 보기

특정 단위에 대한 모든 저널 항목을 보려면 다음과 같이 -u 스위치를 사용하십시오.

journalctl -u apache2.service

현재 부팅을 0으로 낮추려면 다음 명령을 입력하십시오.

journalctl -b -u apache2.service

이전 부팅의 로그를 표시하려면 이것을 사용하십시오.

journalctl -b -1 -u apache2.service

다음은 기타 유용한 명령입니다.

journalctl -u apache2.service  
journalctl -u apache2.service --since today
journalctl -u apache2.service -u nagios.service --since yesterday

프로세스에서 생성된 로그 메시지 보기

특정 프로세스에서 생성된 로그를 보려면 해당 프로세스의 PID를 다음과 같이 지정하세요.

journalctl _PID=19487
journalctl _PID=19487 --since today
journalctl _PID=19487 --since yesterday

사용자 또는 그룹 ID별로 생성된 로그 메시지 보기

특정 사용자 또는 그룹이 생성한 로그를 보려면 해당 사용자 또는 그룹 ID를 다음과 같이 지정하세요.

journalctl _UID=1000
journalctl _UID=1000 --since today
journalctl _UID=1000 -b -1 --since today

파일에 의해 생성된 로그 보기

D-Bus 실행 파일이나 bash 실행 파일과 같은 파일(실행 파일일 수 있음)에 의해 생성된 모든 로그를 표시하려면 간단히 입력하면 됩니다.

journalctl /usr/bin/dbus-daemon
journalctl /usr/bin/bash

우선순위별로 로그 메시지 보기

-p 플래그를 사용하여 메시지 우선순위 또는 우선순위 범위를 기준으로 출력을 필터링할 수도 있습니다. 가능한 값은 다음과 같습니다: 0 – 비상, 1 – 경고, 2 – 위험, 3 – 오류, 4 – 경고, 5 – 알림, 6 – 정보, 7 – 디버그):

journalctl -p err

범위를 지정하려면 아래 형식을 사용하십시오(경고에 등장).

journalctl -p 1..4
OR
journalctl -p emerg..warning

실시간으로 로그 메시지 보기

-f 옵션(tail -f 기능과 유사)을 사용하여 로그가 작성되는 동안 실제로 로그를 볼 수 있습니다.

journalctl -f

분개 표시 형식 처리

저널 항목의 출력 형식을 제어하려면 -o 플래그를 추가하고 cat, import, json, json-pretty, json-sse, short, short-iso, short-monotonic, short-precise 및 verbose(맨 페이지에서 옵션의 의미를 확인하세요:

cat 옵션은 메타데이터(타임스탬프 등) 없이 각 저널 항목의 실제 메시지를 표시합니다.

journalctl -b -u apache2.service -o cat

시스템에서 저널 관리

저널 파일의 내부 일관성을 확인하려면 --verify 옵션을 사용하세요. 모든 것이 정상이면 출력에 PASS가 표시되어야 합니다.

journalctl --verify

PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal                               
491f68: Unused data (entry_offset==0)                                                                
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000003184-000551f9866c3d4d.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000001fc8-000551f5d8945a9e.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000d4f-000551f1becab02f.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000001-000551f01cfcedff.journal

오래된 저널 파일 삭제

--disk-usage 옵션을 사용하면 모든 저널 파일의 현재 디스크 사용량을 표시할 수도 있습니다. 모든 보관된 저널 파일과 활성 저널 파일의 디스크 사용량 합계를 표시합니다.

journalctl --disk-usage

오래된(보관된) 저널 파일을 삭제하려면 아래 명령을 실행하십시오.

sudo journalctl --vacuum-size=50M  #delete files until the disk space they use falls below the specified size
sudo journalctl --vacuum-time=1years	#delete files so that all journal files contain no data older than the specified timespan
sudo journalctl --vacuum-files=4     #delete files so that no more than the specified number of separate journal files remain in storage location

저널 파일 회전

마지막으로 --rotate 옵션을 사용하여 저널 파일을 회전하도록 저널에 지시할 수 있습니다. 이 지시문은 회전 작업이 완료될 때까지 반환되지 않습니다.

sudo journalctl --rotate

심층적인 사용 가이드 및 옵션을 보려면 다음과 같이 Journalctl 매뉴얼 페이지를 확인하세요.

man journalctl

유용한 기사를 확인해 보세요.

  1. 시스템 시작 프로세스 및 서비스 관리(SysVinit, Systemd 및 Upstart)
  2. Petiti – Linux SysAdmins용 오픈 소스 로그 분석 도구
  3. Linux에서 Logrotate를 사용하여 로그 회전을 설정하고 관리하는 방법
  4. lnav – Linux 터미널에서 Apache 로그 보기 및 분석

지금은 그게 다입니다. 아래의 피드백을 사용하여 질문을 하거나 이 주제에 대한 생각을 추가하세요.