Skip to content
VDS · 모니터링 및 성능

systemd 로그: 쉬운 journalctl 사용법

로그에서 서비스 실패 원인을 찾는 방법, 시간과 수준으로 필요한 항목을 필터링하는 방법, 로그가 디스크를 가득 채우지 않도록 하는 방법을 알아봐요.

업데이트 2026년 8월 23일

시스템에서 일어나는 거의 모든 일은 systemd 저널에 기록돼요. 서비스가 시작되지 않거나, 머신이 스스로 재부팅되거나, 사이트가 502를 반환할 때 — 답은 보통 이미 기록되어 있어요. 다만 어떻게 물어봐야 하는지를 알아야 하죠.

충분한 다섯 가지 명령

journalctl -u nginx -n 50 --no-pager      # last 50 lines of one service
journalctl -u nginx -f                    # follow in real time
journalctl -p err -b                      # only errors since boot
journalctl --since "10 min ago"           # everything for the last ten minutes
journalctl -b -1 -e                       # previous boot log, end of file

마지막 명령은 갑작스러운 재부팅 후에 특히 유용해요. -b -1은 이전 세션을 열어 주고, 끝부분에서 커널 패닉이었는지, OOM killer가 동작한 건지, 정상 종료였는지 확인할 수 있어요.

-p의 레벨: emerg, alert, crit, err, warning, notice, info, debug. 지정한 레벨은 그보다 중요한 모든 레벨을 포함해요.

실패한 서비스 진단하기

systemctl status myapp
journalctl -u myapp --since today -p warning

systemctl status는 종료 코드와 마지막 줄을 보여주고, journalctl은 전체 상황을 보여줘요. 확인할 것:

  • Main process exited, code=exited, status=1 — 애플리케이션이 스스로 오류와 함께 종료됐어요, 원인은 바로 위 줄에 있어요;
  • Failed to start ... Permission denied — 파일, 디렉터리 또는 1024 미만 포트에 대한 권한 문제예요;
  • 커널의 Killed process ... (java) total-vm... — OOM killer가 동작했어요, Out of memory를 읽어 보세요;
  • Start request repeated too quickly — 서비스가 크래시 루프에 빠졌고 systemd가 시작을 중단했어요. 원인을 고친 뒤 systemctl reset-failed myapp을 실행하세요.

시스템에서 고장 난 모든 것의 목록은 systemctl --failed예요.

시간을 아껴 주는 필터

journalctl --since "2026-08-22 03:00" --until "2026-08-22 04:00"
journalctl -u nginx -u php-fpm            # several services at once
journalctl _PID=1432                      # by specific process
journalctl -k                             # only kernel messages
journalctl -u sshd | grep "Failed password" | tail -20

grep과 조합하세요. 다만 기억하세요: --no-pager 없이 journalctl을 실행하면 페이저가 열리고, q로 종료해요.

저널이 디스크를 먹지 않게 하기

기본적으로 저널은 파티션의 10%까지 커져요. 40 GB 디스크의 VDS-1에서는 4기가바이트예요 — 눈에 띄죠.

journalctl --disk-usage
journalctl --vacuum-size=200M
journalctl --vacuum-time=14d

영구 제한은 /etc/systemd/journald.conf에 있어요:

[Journal]
SystemMaxUse=300M
MaxRetentionSec=1month

그다음 systemctl restart systemd-journald를 실행하세요.

흔한 실수

  • -u 없이 저널 읽기. 일반 스트림은 서비스 기록으로 가득 차 있어서 필요한 줄을 놓치게 돼요. 항상 서비스나 레벨로 좁히세요.
  • 재부팅 후 기록 상실. /var/log/journal 디렉터리가 없으면 저널은 메모리에만 존재해요. 만들어 주세요: mkdir -p /var/log/journal && systemd-tmpfiles --create --prefix /var/log/journal.
  • 거기서 애플리케이션 오류 찾기. Nginx, PostgreSQL 같은 것들은 /var/log의 자체 파일에도 기록해요. 저널이 비어 있다면 그쪽을 확인하세요.

디스크가 가득 차면 journalctl은 공간이 확보될 때까지 동작을 거부할 수 있어요. 이 상황은 Out of disk space 문서에서 다뤄요.