48. Locate and Analyze System Log Files
로깅 기본 사항
Linux 커널과 다양한 애플리케이션이 생성하는 상태 메시지, 오류, 경고는 로그 파일에 저장됩니다. rsyslog(Rocket Fast System for Log Processing)가 주요 로깅 데몬으로, 기본적으로 /var/log에 파일을 저장합니다.
/var/log의 대부분의 로그 파일은 root 사용자로 제한됩니다. 비root 사용자는 su --login 또는 sudo --login으로 전환하여 제한된 로그를 확인합니다.
특정 로그 파일 찾기
모든 로그 파일에서 SSH 로그 검색:
grep -r 'ssh' /var/log/
/var/log/auth.log: SSH 로그 및 인증 관련 이벤트/var/log/syslog: 일반 시스템 메시지 및 서비스 작업
오래된 로그 파일은 .1 접미사 또는 .gz로 압축되어 있으며, 최신 항목은 압축되지 않은 파일에 있습니다.
--text 플래그 (-a) — 바이너리 파일 처리
sudo grep -r 'reboot' /var/log/ # 바이너리 파일 건너뜀
sudo grep -r --text 'reboot' /var/log/ # 바이너리 파일도 텍스트로 처리
/var/log/에는 일반 텍스트 파일뿐만 아니라 바이너리 파일도 존재합니다:
| 파일 | 형식 |
|---|---|
wtmp | 바이너리 — 로그인/재부팅 기록 |
btmp | 바이너리 — 실패한 로그인 기록 |
lastlog | 바이너리 — 사용자별 마지막 로그인 |
기본 grep은 바이너리 파일을 만나면 내용을 출력하지 않고 아래처럼 표시합니다:
Binary file /var/log/wtmp matches
--text(-a)를 추가하면 바이너리 파일을 텍스트처럼 읽어 실제 매칭된 줄을 출력합니다. 단, 바이너리 데이터가 섞여 출력이 깨져 보일 수 있습니다.
wtmp, btmp, lastlog는 바이너리 포맷이므로 grep --text보다 last, lastb, lastlog 명령어로 읽는 것이 더 정확합니다.실시간 로그 모니터링
tail 명령어에 -F 옵션으로 로그 파일 업데이트를 팔로우합니다:
tail -F /var/log/auth.log
grep과 결합하여 특정 항목 필터링:
tail -F /var/log/auth.log | grep "sudo"
팔로우 모드 종료: Ctrl+C
journalctl을 사용한 고급 로그 분석
systemd 기반 Linux 시스템은 구조화된 로그 관리를 위해 journalctl을 사용합니다.
| 명령어 | 설명 |
|---|---|
journalctl /usr/bin/sudo | 특정 명령어 로그 확인 |
journalctl -f | 실시간 로그 팔로우 |
journalctl -p err | 우선순위별 필터링 (emerg, alert, crit, err, warning, notice, info, debug) |
journalctl -S 01:00 -U 02:00 | 시간 범위로 필터링 (-S = since, -U = until) |
journalctl -b 0 | 현재 부팅 로그 확인 |
sudo journalctl --unit=ssh.service |
시간 범위 필터링 (-S / -U)
-S (--since)와 -U (--until) 플래그로 특정 시간 범위의 로그만 조회합니다.
| 형식 | 예시 |
|---|---|
HH:MM | 01:00 — 오늘 오전 1시 |
YYYY-MM-DD | 2024-03-15 — 특정 날짜 |
YYYY-MM-DD HH:MM:SS | "2024-03-15 08:00:00" — 날짜+시간 |
| 상대 표현 | "1 hour ago", "2 days ago", yesterday |
# 오늘 01:00 ~ 02:00 사이 로그
journalctl -S 01:00 -U 02:00
# 특정 날짜 이후 전체 로그
journalctl -S 2024-03-15
# 1시간 전부터 지금까지
journalctl -S "1 hour ago"
# -p와 조합: 어제부터 지금까지 err 이상 로그
journalctl -S yesterday -p err
-U 생략 시 현재 시각까지 조회됩니다.로그 우선순위 레벨 (Priority Levels)
-p 옵션으로 지정하는 우선순위 레벨은 심각도 낮은 것도 포함합니다 — 즉, 지정한 레벨 이상(더 심각한) 의 로그를 모두 표시합니다.
| 레벨 | 번호 | 설명 | 예시 |
|---|---|---|---|
info | 6 | 🔵 정보 — 정상 동작 중 발생하는 일반적인 알림. 오류 아님 | 서비스 시작/종료, 사용자 로그인 성공 |
warning | 4 | 🟡 경고 — 즉각적인 오류는 아니지만 주의가 필요한 상황. 방치하면 문제가 될 수 있음 | 디스크 사용량 높음, 설정 값 비권장 사용 |
err | 3 | 🔴 오류 — 특정 작업이 실패했지만 시스템 전체는 계속 동작 | 서비스 시작 실패, 파일 읽기 오류 |
crit | 2 | 🚨 치명적 — 심각한 장애. 시스템 또는 주요 구성 요소가 위험한 상태 | 커널 패닉 직전 상태, 하드웨어 오류 |
# info 이상 모든 로그 (info, notice, warning, err, crit, alert, emerg)
journalctl -p info
# warning 이상만 (warning, err, crit, alert, emerg)
journalctl -p warning
# 오류 이상만
journalctl -p err
# 치명적 오류 이상만
journalctl -p crit
emerg(0) → alert(1) → crit(2) → err(3) → warning(4) → notice(5) → info(6) → debug(7)
영구 로깅 활성화:
sudo mkdir /var/log/journal/
사용자 로그인 기록 확인
최근 로그인을 역순으로 표시:
last
각 사용자의 마지막 로그인 시간 요약 (원격 로그인의 경우 IP 주소 포함):
lastlog