Ubuntu journald로 시스템 로그 관리하기

서버에 서비스가 늘어날수록 로그도 /var/log/syslog, 각 서비스별 파일, 커널 dmesg로 흩어지고, 장애가 나면 여러 파일을 시간순으로 짜맞춰야 하는 상황이 생긴다. Ubuntu는 기본적으로 systemd-journald가 커널·서비스·유저 로그를 구조화된 바이너리 포맷 하나로 모아두고 있어서, 이미 있는 이 인덱스를 journalctl로 제대로 필터링하는 것만으로 로그 파일을 뒤지는 시간을 크게 줄일 수 있다. 이 글에서는 journalctl 필터링 옵션과 저널 보존 정책(디스크 사용량 확인, vacuum)을 실제 명령으로 확인한다.

핵심 개념

옵션동작
-u <unit>특정 systemd 유닛(서비스)의 로그만 필터링
-t <tag>syslog identifier(태그) 기준으로 필터링
-p <priority>지정한 심각도 이상만 표시 (emerg~debug, 예: err)
--since/--until시간 범위로 필터링
-ftail -f처럼 실시간으로 새 로그를 따라감
--disk-usage / --vacuum-time저널이 차지하는 디스크 용량 확인 / 지정 기간보다 오래된 로그 정리

실전: 필터링과 보존 정책 확인

systemd-cat으로 태그(-t)를 지정해 로그 하나를 남기고, 같은 태그로 바로 조회한다.

$ systemd-cat -t blog_demo bash -c 'echo "테스트 로그 메시지"'
$ journalctl -t blog_demo --no-pager -n 5 --output=short-iso
2026-07-24T00:11:51+09:00 JUNOHOMEPC1 blog_demo[2776]: 테스트 로그 메시지

실제 서비스 유닛(cron) 로그를 -u로 필터링하면 다음과 같다.

$ journalctl -u cron --no-pager -n 3 --output=short-iso
2026-07-23T23:53:41+09:00 JUNOHOMEPC1 (cron)[178]: cron.service: Referenced but unset environment variable evaluates to an empty string: EXTRA_OPTS
2026-07-23T23:53:41+09:00 JUNOHOMEPC1 cron[178]: (CRON) INFO (pidfile fd = 3)
2026-07-23T23:53:41+09:00 JUNOHOMEPC1 cron[178]: (CRON) INFO (Running @reboot jobs)

priority(-p)와 시간 범위(--since)는 함께 조합해서 쓸 수 있다.

$ journalctl -p err --no-pager -n 2 --output=short-iso
2026-07-23T23:53:43+09:00 JUNOHOMEPC1 login[313]: PAM unable to dlopen(pam_lastlog.so): ...
2026-07-23T23:53:43+09:00 JUNOHOMEPC1 login[313]: PAM adding faulty module: pam_lastlog.so

$ journalctl --since "10 minutes ago" -t blog_demo --no-pager --output=short-iso
2026-07-24T00:11:51+09:00 JUNOHOMEPC1 blog_demo[2776]: 테스트 로그 메시지

-p err로는 PAM 모듈 로드 실패 같은 실제 시스템 경고가 바로 걸러진다. 마지막으로 저널이 차지하는 디스크 용량을 확인하고, 보존 기간을 정리한다.

$ journalctl --disk-usage
Archived and active journals take up 470.5M in the file system.

$ journalctl --vacuum-time=100years
Vacuuming done, freed 0B of archived journals from /var/log/journal/dcf769b8c94c470fa14a1ccdaefd7901.
Vacuuming done, freed 0B of archived journals from /run/log/journal.
Vacuuming done, freed 0B of archived journals from /var/log/journal.

--vacuum-time=100years처럼 사실상 정리되지 않을 값을 주면 실제로 지우지 않고 현재 상태만 확인할 수 있어, 운영 중인 서버에서 실수로 로그를 날리기 전에 먼저 안전하게 동작을 점검해볼 수 있다.

주의사항

  • 저널이 영속 저장소(/var/log/journal)에 쌓이는지, 재부팅 시 사라지는 /run/log/journal(휘발성)에만 쌓이는지는 /etc/systemd/journald.confStorage= 값과 /var/log/journal 디렉터리 존재 여부로 결정된다.
  • --vacuum-size/--vacuum-time은 실제로 오래된 저널 파일을 삭제하는 명령이다. 운영 서버에서는 짧은 기간 값으로 바로 실행하기 전에 --disk-usage로 현재 용량부터 확인하는 게 안전하다.
  • SystemMaxUse=/SystemKeepFree= 같은 상한을 journald.conf에 미리 설정해두지 않으면 저널이 디스크를 예상보다 많이 차지할 수 있다.
  • -p err는 해당 priority “이상”(더 심각한 쪽)을 모두 포함한다 — err보다 심각한 crit/alert/emerg도 함께 나온다.

마무리

흩어진 로그 파일을 grep으로 뒤지는 대신, 이미 모든 서비스 로그가 모여 있는 저널을 -u/-t/-p/--since 조합으로 필터링하는 습관을 들이면 장애 조사 시간이 눈에 띄게 줄어든다. --disk-usage로 주기적으로 용량을 확인하고 보존 정책을 미리 정해두는 것도 함께 챙길 부분이다.

참고

답글 남기기