systemd의 도입은 리눅스 시스템 로깅 방식에 혁신적인 변화를 가져왔습니다. 이제 `journalctl` 명령어를 통해 시스템 로그 메시지를 확인하고, 다양한 필터링을 적용하는 방법을 알아볼 시간입니다.
중앙화된 로깅 시스템의 등장
systemd는 시스템 및 서비스 관리자로서, 시스템 로그를 모으는 방식에 큰 변화를 주었습니다. 과거에는 로그가 생성된 서비스나 데몬에 따라 파일 시스템 내 여러 위치에 분산되어 있었으며, 모두 일반 텍스트 파일 형태였습니다. 그러나 systemd는 모든 시스템, 부팅, 커널 로그를 중앙의 전용 로깅 솔루션에서 관리합니다. 로그는 바이너리 형식으로 저장되며, 이 덕분에 데이터를 JSON과 같은 다양한 형식으로 추출할 수 있습니다. 이는 여러 로그 파일에 분산되어 있던 관련 정보를 쉽게 상호 참조할 수 있게 해줍니다. 데이터가 이제 단일 저널에 저장되므로, 다양한 소스의 데이터를 통합하여 보기 쉬운 목록으로 만들 수 있습니다.
`journalctl`은 바로 이 저널을 다루기 위한 필수 도구입니다. 저널 작업에 사용되는 핵심 명령어입니다.
`journalctl` 기본 사용법
아무런 매개변수 없이 `journalctl`을 실행하면 다음과 같이 나타납니다.
journalctl
저널의 모든 내용을 보여주며, 가장 오래된 항목부터 목록의 상단에 나타납니다. 출력은 `less`를 통해 보여지므로, 일반적인 `less` 탐색 기능을 사용하여 페이지를 탐색하고 검색할 수 있습니다. 가로로 스크롤하여 긴 로그 항목도 확인할 수 있습니다.
End 키를 누르면 목록의 가장 아래로 이동하여 최신 로그 항목을 볼 수 있습니다.
작업을 마치려면 Ctrl+C를 누릅니다.
`journalctl`은 `sudo` 없이도 실행할 수 있지만, 모든 세부 정보를 확인하려면 `sudo`를 사용하는 것이 좋습니다.
sudo journalctl
만약 `journalctl`의 출력을 `less`가 아닌 터미널 창에 바로 표시하고 싶다면, `–no-pager` 옵션을 사용하면 됩니다.
sudo journalctl --no-pager
출력은 터미널 창을 빠르게 스크롤하며 지나가고, 명령 프롬프트로 되돌아갑니다.
`journalctl`이 반환하는 줄 수를 제한하려면 `-n (줄 수)` 옵션을 사용합니다. 다음은 마지막 10줄의 출력을 보여주는 예시입니다.
sudo journalctl -n 10
저널 실시간 업데이트 보기
저널에 새로운 항목이 추가될 때마다 실시간으로 최신 항목을 표시하려면 `-f` (follow) 옵션을 사용합니다.
sudo journalctl -f
최신 항목의 타임스탬프는 07:09:07입니다. 새로운 활동이 발생하면 새로운 항목이 화면 하단에 추가됩니다. 실시간에 가까운 업데이트를 경험할 수 있습니다!
예시에서는 07:09:59에 ‘geek-app’이라는 애플리케이션이 저널에 “New Message from HTG”라는 로그 항목을 추가한 것을 확인할 수 있습니다.
표시 형식 변경하기
저널은 이진 파일이므로, 내용을 표시하려면 데이터를 번역하거나 텍스트로 구문 분석해야 합니다. 서로 다른 파서를 사용하면 같은 바이너리 데이터에서 다양한 출력 형식을 생성할 수 있습니다. `journalctl`은 다양한 출력 형식을 제공합니다.
기본 출력은 전통적인 시스템 로그 형식과 매우 유사한 ‘짧은 형식’입니다. 짧은 형식을 명시적으로 요청하려면 `-o` (출력) 옵션과 함께 `short` 수정자를 사용합니다.
sudo journalctl -n 10 -o short
왼쪽에서 오른쪽으로, 각 필드는 다음과 같습니다:
- 메시지가 생성된 시간 (현지 시간)
- 호스트 이름
- 프로세스 이름 (메시지를 생성한 프로세스)
- 로그 메시지
전체 날짜 및 시간 스탬프를 보려면 `short-full` 수정자를 사용합니다.
sudo journalctl -n 10 -o short-full
이 출력의 날짜 및 시간 형식은, 앞으로 보게 될 것처럼 기간별로 로그 메시지를 선택할 때 날짜와 시간을 제공해야 하는 형식입니다.
각 로그 메시지와 함께 제공되는 모든 메타데이터를 보려면 `verbose` 수정자를 사용합니다.
sudo journalctl -n 10 -o verbose
다양한 필드가 존재하지만, 모든 필드가 메시지에 있는 경우는 드뭅니다.
여기서 주목할 만한 필드 중 하나는 ‘우선순위’ 필드입니다. 이 예시에서는 값이 6입니다. 값은 메시지의 중요도를 나타냅니다.
0: | 비상. 시스템을 사용할 수 없습니다. |
1: | 경고. 즉시 수정해야 하는 상태를 나타냅니다. |
2: | 심각. 기본 애플리케이션의 충돌, 코어 덤프 등 심각한 오류를 포함합니다. |
3: | 오류. 오류가 보고되었지만, 심각하지는 않습니다. |
4: | 경고. 무시할 경우 오류가 발생할 수 있는 상태를 주의해야 합니다. |
5: | 알림. 비정상적이지만, 오류가 아닌 이벤트를 보고하는 데 사용합니다. |
6: | 정보. 정상적인 운영 메시지. 조치가 필요하지 않습니다. |
7: | 디버그. 애플리케이션 디버깅을 위해 메시지를 추가할 수 있습니다. |
출력이 올바른 형식의 JSON 객체로 표시되도록 하려면 `json` 수정자를 사용합니다.
sudo journalctl -n 10 -o json
각 메시지는 올바른 형식의 JSON 객체로 감싸져 있으며, 각 출력 라인에는 하나의 메시지가 표시됩니다.
JSON 출력을 읽기 좋게 만들려면 `json-pretty` 수정자를 사용합니다.
sudo journalctl -n 10 -o json-pretty
각 JSON 객체는 여러 줄로 나뉘어지고, 각 이름-값 쌍은 새 줄에 표시됩니다.
타임스탬프나 기타 메타데이터 없이 로그 메시지만 보려면 `cat` 수정자를 사용합니다.
sudo journalctl -n 10 -o cat
이 표시 형식을 사용하면 로그 이벤트를 발생시킨 프로세스를 식별하기 어려울 수 있지만, 메시지에 단서가 포함되어 있는 경우도 있습니다.
특정 기간의 로그 메시지 선택
특정 기간의 로그 메시지만 확인하고 싶다면, `journalctl`의 `-S` (시작 시간) 및 `-U` (종료 시간) 옵션을 활용할 수 있습니다.
특정 시간 및 날짜 이후의 로그 항목을 보려면 다음 명령을 사용합니다.
sudo journalctl -S "2020-01-12 07:00:00"
명령에 지정된 날짜 및 시간 이후에 기록된 메시지만 표시됩니다.
특정 기간의 로그 메시지만 확인하려면, `-S` (시작 시간) 및 `-U` (종료 시간) 옵션을 함께 사용합니다. 다음 명령은 15분 동안의 로그 메시지를 보여줍니다.
sudo journalctl -S "2020-01-12 07:00:00" -U "2020-01-12 07:15:00"
이 방법은 시스템에 이상이 발생했고, 대략적인 발생 시간을 알고 있을 때 매우 유용합니다.
상대적인 시간 사용
기간을 지정할 때, 상대적인 주소 지정을 사용할 수도 있습니다. 예를 들어, “하루 전부터 지금까지의 모든 이벤트를 보여줘”와 같이 말할 수 있습니다. 다음 명령은 바로 그것을 의미합니다. ‘d’는 ‘일’을 의미하며, ‘-1’은 과거의 하루를 나타냅니다.
sudo journalctl -S -1d
로그 메시지는 어제 00:00:00부터 ‘지금’까지 나열됩니다.
최근 발생한 일을 조사할 때는 시간 단위로 측정된 상대적 기간을 지정할 수 있습니다. 다음은 지난 1시간 동안의 로그 메시지를 확인하는 예시입니다.
sudo journalctl -S -1h
지난 시간의 메시지가 표시됩니다. 또한, `m`을 사용하여 분 단위로, `w`를 사용하여 주 단위로 상대 기간을 설정할 수도 있습니다.
`journalctl`은 `today`, `yesterday`, `tomorrow`를 이해합니다. 이러한 수정자는 일반적인 기간을 지정하는 편리한 방법을 제공합니다. 어제 발생한 모든 이벤트를 보려면 다음 명령을 사용합니다.
sudo journalctl -S yesterday
어제 자정 00:00:00부터 발생한 모든 저널 로그 이벤트가 검색되어 표시됩니다.
오늘 수신한 모든 로그 메시지를 보려면 다음 명령을 사용합니다.
sudo journalctl -S today
00:00:00부터 명령이 실행될 때까지의 모든 것이 표시됩니다.
다양한 기간 수정자를 조합하여 사용할 수도 있습니다. 이틀 전부터 오늘 시작 시간까지의 모든 내용을 보려면 다음 명령을 사용합니다.
sudo journalctl -S -2d -U today
어제부터 오늘까지의 모든 로그가 검색되어 표시됩니다.
데이터 필드를 이용한 로그 메시지 선택
로그 메시지를 다양한 저널 필드와 일치시켜 검색할 수 있습니다. 이러한 검색은 각 메시지에 첨부된 메타데이터에서 일치하는 항목을 찾습니다. 필드 목록을 참조하여 가장 유용한 필드를 선택하십시오.
애플리케이션이 모든 필드를 채우는지는 애플리케이션 작성자에 달려 있습니다. 모든 필드가 채워진다고 보장할 수는 없습니다.
모든 저널 필드 수정자는 같은 방식으로 사용됩니다. 아래 예시에서는 몇 가지를 사용해 보겠습니다. 특정 애플리케이션의 로그 메시지를 찾으려면 `_COMM` (명령) 수정자를 사용합니다. `-f` (follow) 옵션을 함께 사용하면, `journalctl`은 해당 애플리케이션에서 새로운 메시지가 도착하는 대로 실시간으로 추적합니다.
sudo journalctl -f _COMM=geek-app
로그 메시지를 생성한 프로세스의 프로세스 ID를 사용하여 로그 항목을 검색할 수도 있습니다. `ps` 명령을 사용하여 찾고자 하는 데몬 또는 애플리케이션의 프로세스 ID를 찾으십시오.
sudo journalctl _PID=751
이 기사 작성에 사용된 컴퓨터에서 SSH 데몬의 프로세스 ID는 751입니다.
다음으로는 사용자 ID를 사용하여 검색할 수 있습니다. 이는 애플리케이션 또는 명령을 실행한 사람 또는 프로세스를 소유한 사람의 사용자 ID입니다.
sudo journalctl _UID=1000
다른 사용자 ID와 연결된 모든 메시지는 걸러지고, 사용자 ID 1000과 관련된 메시지만 표시됩니다.
특정 애플리케이션과 관련된 로그 메시지를 검색하는 또 다른 방법은, 실행 파일의 경로를 제공하는 것입니다.
sudo journalctl /usr/bin/anacron
검색을 더 쉽게 하기 위해 저널 필드에 저장된 값을 나열하도록 `journalctl`에 요청할 수 있습니다.
저널이 기록한 사용자 ID를 보려면 `-F` (필드) 옵션을 사용하고 `_UID` 필드 식별자를 전달합니다.
journalctl -F _UID
이번에는 그룹 ID (GID)를 확인해 보겠습니다.
journalctl -F _GID
저널 필드 식별자 중 하나를 사용하여 이 작업을 수행할 수 있습니다.
커널 메시지 나열
커널 메시지를 빠르게 분리하는 방법도 내장되어 있습니다. 직접 검색하고 분리할 필요가 없습니다. `-k` (커널) 옵션은 다른 모든 메시지를 제거하고, 커널 로그 항목만 표시합니다.
sudo journalctl -k
강조 표시는 우선순위 필드의 값에 따라 메시지의 중요도를 나타냅니다.
부팅 메시지 검토
조사해야 할 부팅 관련 문제가 있는 경우, `journalctl`을 이용하면 문제 해결에 도움을 받을 수 있습니다. 새 하드웨어를 추가했는데 작동하지 않거나, 마지막 시스템 업데이트 이후 기존 하드웨어가 더 이상 작동하지 않을 수 있습니다.
마지막 부팅과 관련된 로그 항목을 보려면 `-b` (부팅) 옵션을 사용합니다.
journalctl -b
마지막 부팅에 대한 로그 항목이 표시됩니다.
‘마지막 부팅’은 현재 로그인한 세션 동안 컴퓨터를 시작한 부팅 프로세스를 의미합니다. 이전 부팅을 보려면, 숫자를 사용하여 `journalctl`에 원하는 부팅을 알려줄 수 있습니다. 예를 들어 세 번째 이전 부팅을 보려면 다음 명령을 사용합니다.
journalctl -b 3
일반적으로 문제가 있어 시스템을 재부팅해야 하는 경우, 확인하고 싶은 부팅 순서일 가능성이 큽니다. 따라서 이 명령 형식은 매우 유용합니다.
부팅 순서가 헷갈릴 수 있습니다. 이럴 때는 `–list-boots` 옵션을 사용하여 저널에 기록된 부팅 목록을 확인할 수 있습니다.
journalctl --list-boots
날짜 및 시간 스탬프를 보고 확인하려는 부팅을 식별한 다음, 왼쪽 열의 숫자를 사용하여 해당 부팅 시퀀스에 대한 로그 메시지를 얻을 수 있습니다. 32비트 부팅 식별자를 선택하여 `journalctl`에 전달할 수도 있습니다.
sudo journalctl -b 1f00248226ed4ab9a1abac86e0d540d7
요청한 부팅 시퀀스의 로그 메시지가 검색되어 표시됩니다.
저널 하드 드라이브 공간 관리
저널 및 모든 로그 메시지는 하드 드라이브에 저장되므로, 하드 드라이브 공간을 차지합니다. 저널이 차지하는 공간을 확인하려면, `–disk-usage` 옵션을 사용합니다.
journalctl --disk-usage