시스템을 디버깅 하다보면 로그를 봐야할 일이 많이 있다. 파이썬이나 C 에서 띄워주는 컴파일/런타임 에러 말고.. 시스템에서 부팅 또는 커널레벨에서의 로그를 봐야 하는 경우가 왕왕 있다. 이 경우 많이 쓰는 두 명령어가 바로 'dmesg' 와 'journalctl' 이다.
그런데 궁금한 점은 이 두 로그를 보는 명령어는 어떤 차이일까? 그리고 어떤 경우에 어떤걸 사용해야 할까? 이번 기회에 한번 정리해보았다.
dmesg란?
dmesg는 "diagnostic message"의 약자로, 리눅스 커널에서 발생하는 진단 메시지를 확인할 수 있는 명령어다. 주로 커널에서 하드웨어, 장치 드라이버, 그리고 시스템 부팅 과정에서 발생한 이벤트를 확인하는 데 사용된다.
- 로그의 위치: /var/log/dmesg
- 해당 파일은 부팅 시점의 로그를 저장하며, 실시간 로그는 아님에 유의해야 한다.
- 커널 링 버퍼(Kernel Ring Buffer):
- dmesg 명령은 커널 링 버퍼의 내용을 출력한다. 커널 링 버퍼는 순환 버퍼(circular buffer) 방식으로 동작하며, 일정 용량을 초과하면 가장 오래된 로그가 새 로그로 덮어쓰여진다.
dmesg를 sudo 없이 실행하기
dmesg는 기본적으로 root 권한이 필요하다. 일반 사용자가 실행하려면 sticky bit를 추가해야 한다.
sudo chmod u+s /bin/dmesg
journal이란?
journal은 리눅스의 로그 관리 시스템으로, systemd의 systemd-journald가 모든 로그를 수집 및 저장한다. 단순한 커널 로그만 제공하는 dmesg와는 달리, 시스템 서비스와 사용자 애플리케이션 로그까지 포함하여 로그를 제공한다.
journal의 로그 종류
- 커널 로그: dmesg의 내용을 포함한다.
- 시스템 서비스 로그: systemd가 관리하는 각종 서비스의 실행 상태 및 오류 메시지.
- 애플리케이션 로그: 사용자 애플리케이션에서 생성한 로그.
로그 저장 위치
- /var/log/journal 디렉터리에 로그 파일이 저장된다.
(저널 기능이 활성화되지 않은 경우, 기본적으로 /run/log/journal 디렉터리에 저장되며 재부팅 시 삭제된다.)
journalctl 명령어로 로그 확인하기
journal은 journalctl 명령어를 통해 다양한 방식으로 필터링 및 확인할 수 있다.
journalctl -f # 실시간 로그
journalctl -u sshd # 특정 service 로그 필터
journalctl --since "1 hour ago" # 시간 기준 필터
journalctl --since "2024-11-20 10:00:00" --until "2024-11-20 12:00:00"
journalctl -p err # 심각성으로 필터
dmesg와 journal의 비교
로그 범위 | 커널 레벨 (하드웨어, 장치 드라이버, 커널 경고 등) | 커널, 시스템 서비스, 사용자 애플리케이션까지 포함 |
지속성 | 메모리(RAM)에 저장되며, 재부팅 시 로그가 사라짐 | /var/log/journal에 저장되어 재부팅 후에도 유지 |
기타 | 간단하고 빠르게 커널 로그를 확인할 수 있음 | 강력한 필터링 기능과 검색 옵션을 제공 |
결론
dmesg는 간단한 커널 로그 확인에 적합하고, journal은 좀 더 폭넓은 로그 관리를 위한 도구다. 좀 더 쉽게 정리하면 커널이나 device driver 레벨에서는 dmesg 로 확인하고 systemctl 등의 서비스 로그는 journalctl 로 확인하면 된다 (일반적으로는).
'시스템 프로그래밍' 카테고리의 다른 글
커널 모듈(Kernel Module) (1) | 2024.11.27 |
---|---|
SELinux: 리눅스 보안 툴 2 (0) | 2024.11.22 |
AppArmor, 리눅스 보안 툴 (0) | 2024.11.20 |
GStreamer 란? (1) | 2024.11.19 |
왜 자꾸 sudo apt update 를 쳐줘야 할까? (0) | 2024.11.16 |