journalctl을 시간 창과 -o json과 함께 실행하면, 저널에 저장된 모든 필드가 포함된 JSON 객체가 줄 별로 표시됩니다:
sudo journalctl --since "2026-10-19 00:00" --until "2026-10-20 00:00" -o json --no-pager > web-03_journal.jsonl
대신 syslog 스타일의 텍스트 파일을 원한다면 -o short-iso를 사용하십시오. sudo 또는 systemd-journal, adm, wheel의 멤버십 없이는 시스템의 저널이 아닌 자신의 사용자 저널만 볼 수 있습니다.
대부분의 최신 배포판에서 저널은 모든 것이 먼저 도착하는 곳입니다: 서비스, 커널, sudo, cron, 로그인. Debian 12 이후, Fedora 및 Arch에서는 유일한 장소일 수 있습니다, 왜냐하면 rsyslog가 설치되지 않았기 때문입니다. Prime Core에는 Linux 시스템 로그에 대한 {N}개의 탐지 규칙이 있으며, cron 지속성(T1053.003), 악의적인 systemd 서비스(T1543.002), sudo 남용(T1548.003) 등을 맵핑된 {M}개의 MITRE ATT&CK 기술이 포함되어 있습니다.
시작하기 전에
권한. 모든 시스템 로그에 대한 동일한 규칙: root 또는 상기 그룹. [Linux 로그 권한 가이드]는 세부 정보를 포함하고 있습니다.
저널이 재부팅 후에도 살아남습니까? /var/log/journal이 존재하지 않으면 로그는 /run/log/journal 하의 메모리에 존재하고 재부팅 시 사라집니다. journalctl –list-boots는 실제로 몇 번의 부팅이 있는지를 보여줍니다. 현재 것만 나열하면 이전 기록은 사라진 것입니다.
얼마나 많은 데이터가 있습니까? journalctl –disk-usage를 사용하여 모두 파일로 덤프하기 전에 알려줍니다. 기본적으로, 지속적인 저널은 파일 시스템의 10%까지 확장될 수 있으며, 최대 4GB로 제한됩니다. 이는 한 번에 업로드하고 싶은 양보다 훨씬 더 많습니다.
시간대. 저널은 UTC로 타임스탬프를 저장하지만, journalctl은 –utc를 추가하지 않으면 로컬 시간을 출력합니다. JSON 출력은 __REALTIME_TIMESTAMP라는 원시 UTC 마이크로초 타임스탬프를 포함합니다.
1단계: 축소하기
질문에 맞는 필터를 선택하십시오. 이들은 결합됩니다:
| 필터 | 작동 방식 |
|---|---|
| –since / –until | 시간 창; “2026-10-19 14:00”, 어제 또는 “2시간 전” 수락 |
| -b, -b -1 | 현재 부팅, 이전 부팅 |
| -u nginx -u ssh | 하나 이상의 systemd 유닛 |
| -p warning | 그 우선 순위 및 더 심각한 것들 |
| -k | 커널 메시지 전용 |
| _COMM=sudo, _UID=0 | 모든 저널 필드의 정확한 일치 |
2단계: 출력 형식 선택
- -o json: 모든 필드를 포함한 줄당 한 개의 JSON 객체. LogTotal의 기본 선택입니다, 아무것도 손실되지 않기 때문입니다.
- -o json –output-fields=MESSAGE,_HOSTNAME,_COMM,_PID,SYSLOG_IDENTIFIER,PRIORITY: 동일하지만, 절삭됨. 타임스탬프와 부팅 ID 같은 몇 가지 필드는 항상 포함됩니다. 파일 크기가 크게 줄어듭니다.
- -o short-iso: 전체 ISO 타임스탬프가 있는 syslog 스타일 텍스트. 더 작고 읽기 쉽습니다. [PROOF: LogTotal이 short-iso를 구문 분석하는지 확인]
-o export를 사용하지 마십시오. 이름에도 불구하고, systemd 머신 간의 저널 배송을 위한 직렬화 형식입니다, 분석할 것이 아닙니다.
보통 범위가 지정된 내보내기를 추천합니다:
sudo journalctl -b -1 -p info -u ssh -u cron
-o json --no-pager > web-03_prevboot.jsonl
3단계(선택 사항): 다른 머신에서 저널 파일 읽기
사건 작업에서는 종종 디스크 이미지나 복사된 /var/log/journal 폴더가 있으며, 라이브 시스템이 아닙니다. journalctl은 이를 직접 읽습니다:
journalctl -D /mnt/evidence/var/log/journal -o json --no-pager > evidence_journal.jsonl
–file을 사용하여 개별 .journal 파일을 가리킵니다. 충돌하거나 비정상적으로 종료된 시스템의 경우 저널은 손상 경고를 출력할 수 있습니다. 대부분의 항목은 여전히 나옵니다.
LogTotal에서 업로드, 정제 및 리뷰
- 업로드. 열기 logtotal.com 그리고 .jsonl 파일을 드롭하십시오. [PROOF: 업로드 화면, 크기 제한]
- 정제. [PROOF: what gets masked in journal JSON: hostnames, usernames, IPs, machine and boot IDs]. Look it over before you continue.
- 리뷰. [PROOF: what the results screen shows]
실제 데이터에서 어떻게 보이는가. 우리는 하루 저널을 [PROOF: 예시 소스, 예를 들어 cron 작업을 추가하고, 새 사용자를 추가하고, 의심스러운 systemd 서비스를 추가한 후의 테스트 VM]로부터 내보냈습니다. LogTotal은 [PROOF: 실제 발견 항목]를 플래그했습니다. [PROOF: 샘플 파일 링크]
문제가 발생했을 때
| 증상 | 가능한 원인 | Fix |
|---|---|---|
| 다른 사용자로부터 메시지를 보지 못하는 힌트 | root가 아니고, 저널 그룹에 속하지 않음 | sudo, 또는 계정을 systemd-journal에 추가 |
| — 항목 없음 — | 시간 창 혹은 유닛 이름이 일치하지 않음; 로컬 vs. UTC 혼란 | 창을 넓히세요; –utc를 시도하세요; systemctl list-units를 확인하세요 |
| 현재 부팅만 존재 | 휘발성 저널 | 이전 로그가 사라졌습니다; 로그 포워더나 SIEM을 확인하세요 |
| 출력이 바이너리 같은 또는 깨져 보임 | -o export가 사용됨 | -o json을 사용하세요 |
| 파일이 기가바이트입니다 | 필터 없음 | 유닛, 우선 순위, –output-fields를 추가하세요 |
FAQ
JSON 또는 텍스트?
분석을 위해 JSON을 사용합니다, 왜냐하면 PID, 유닛, 부팅 ID, 정확한 타임스탬프를 별도의 필드로 유지하기 때문입니다. 사람이 읽을 때 또는 크기가 중요할 때 텍스트를 사용합니다.
저널이 /var/log/syslog와 동일합니까?
아니요. rsyslog가 설치된 경우, 저널에서 메시지를 텍스트 파일로 복사하기 때문에 둘 다 있을 수 있습니다. 설치되지 않은 경우, 저널이 전부입니다.