본문 바로가기
운영체제/Linux

Linux ] journalctl 사용법 (systemd-journald)

by eteo 2025. 11. 21.
반응형

 

 

journalctl

journalctl은 systemd-journald의 CLI 도구로, systemd 기반 init 시스템을 사용하는 리눅스에서 커널/서비스/사용자 프로세스의 로그를 한데 모아 조회할 수 있게 해주는 표준 툴이다.

 

 

 

 

저장 경로 

journal 로그는 텍스트 파일이 아니라 바이너리 데이터로 저장되며, 저장 유형에 따라 하기 디렉토리 아래 <machine-id> 디렉토리 내 .journal 파일로 저장된다.

 

  • 비영속 (RAM(tmpfs) 저장) : /run/log/journal/
  • 영속 (디스크 저장) : /var/log/journal/

 

한편, systemd-journal의 저장 방식/용량 정책 등을 설정하는 구성 파일은 /etc/systemd/journald.conf 경로에 존재한다.

 

 

 

 

 

기본 사용법

# 전체 로그 출력
journalctl

# 최근 N줄 출력
journalctl -n 200

# 실시간 추적
journalctl -f

# 최신 -> 과거 순으로 역순으로 보기 (기본은 과거 -> 최신 순)
journalctl -r

# 로그 끝으로 점프하기
journalctl -e

# less 없이 출력하기 (기본 출력 시 페이징을 지원한다)
journalctl --no-pager

 

 

 

 

 

 

 

과거 부팅 로그까지 보존하도록 설정하는 법

1. /etc/systemd/journald.conf 파일을 편집기로 연다.

sudo vim /etc/systemd/journald.conf

 

 

2. 아래 설정을 찾아서 주석 해제하고 persistent로 변경한다. (주석 처리되어 있으면 기본값은 auto라서 그냥 놔둬도 된다.)

[Journal]
Storage=persistent
  • volatile : /run/log/journal 에 저장
  • persistent : /var/log/journal 에 저장
  • auto : /var/log/journal 이 있으면 persistent, 없으면 volatile 설정으로 동작
  • none : 저장 안함

 

 

3. 영속 저장을 위한 디렉토리를 생성하고 권한을 설정한다.

sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal

 

 

4. journald 서비스를 재시작한다.

sudo systemctl restart systemd-journald

 

 

5. 디스크 사용량과 부팅 인덱스를 확인한다.

journalctl --disk-usage
journalctl --list-boots

 

 

 

 

 

 

필터 옵션 사용법

# 특정 서비스 로그만 보기
journalctl -u myapp.service

# 지정한 서비스의 재시작 이후 로그만 보기
journalctl -u myapp.service --since "restart"

# 시간 단위 필터링
journalctl --since "1 hour ago"
journalctl --since "30 min ago"
journalctl --since "yesterday"
journalctl --since "2025-09-30 18:00" --until "2025-09-30 19:00"

# 부팅 목록 확인
journalctl --list-boots

# 현재 부팅 로그만 확인
journalctl -b

# 이전 부팅(-1) 또는 그 이전(-2)... 부팅 로그만 확인
journalctl -b -1
journalctl -b -2

# syslog 레벨 기반 error(3) 이상만 또는 warning(4) 이상만
journalctl -p err
journalctl -p warning

# 두 syslog 레벨 사이의 로그만
journalctl -p notice..err

 

 

 

 

 

 

 

✓ syslog() 함수

참고로 systemd 서비스로 등록된 프로그램의 경우, stdout과 stderr로 출력된 메시지는 journald로 자동으로 리다이렉션되어 각각 info(6), err(3) 레벨로 분류된다. 반면, 단독 실행된 일반 프로세스의 표준 스트림 출력은 journald로 수집되지 않는다. 만약 시스템 로그 데몬(systemd-journald 또는 rsyslog)으로 메시지를 직접 전달하기 원한다면 syslog.h를 포함하고 syslog() 함수를 사용할 수 있으며, 이때 로그의 레벨을 명시적으로 지정할 수 있다.

 

#include <syslog.h>

syslog(LOG_WARNING, "Temperature high: %d °C", temp);
syslog(LOG_ERR, "Critical failure in Temp sensor!");

 

 

 

 

 

 

용량 및 보존 관리

# 현재 journald의 디스크 사용량 확인
journalctl --disk-usage

# 전체 .journal 파일의 크기를 200MB로 유지 (초과 시 오래된 것부터 삭제)
sudo journalctl --vacuum-size=200M

# 7일분만 보존
sudo journalctl --vacuum-time=7d

 

반응형