로그로 원인 찾기 · 섞인 형식을 한 레코드로 · 실습
로그를 받았는데 세 가지 형식이 섞여 있었다
목표
형식이 서로 다른 로그 파일 세 개를 한 줄 한 레코드의 NDJSON 으로 정규화하고, 여러 줄 예외를 한 레코드로 묶고, 파싱하지 못한 줄을 격리한 뒤 셋을 공통 스키마로 합칩니다.
왜 중요한가
현장에서 처음 받는 로그 묶음은 정돈되어 있지 않습니다. 형식이 섞인 채로 grep -c 를 돌리면 예외 한 건이 오류 열 건으로 세어지고, 그 숫자가 그대로 보고서에 실립니다. 시각 표기도 파일마다 달라서 문자열로 정렬하면 시간순이 되지 않습니다. 그래서 분석 전에 "무엇이 한 레코드인가" 와 "시각을 어떤 문자열로 굳히는가" 를 먼저 정해야 합니다. 이 결정은 코드가 아니라 계약이고, 문서로 남지 않으면 다음 사람이 같은 파일에서 다른 숫자를 냅니다.
단계
1. /root/norm/gen_norm.py 를 만들어 실행해 /root/norm/raw/ 아래 app.log · gateway.log · sys.log 를 만드세요.
2. /root/norm/counts.json 에 물리적 줄 수와 논리 레코드 수를 갈라 적으세요.
3. /root/norm/app.ndjson — 애플리케이션 로그를 한 줄 한 레코드로 묶으세요.
4. /root/norm/gw.ndjson — Combined 접근 로그를 구조화하세요.
5. /root/norm/sys.ndjson — RFC 5424 syslog 를 구조화하세요.
6. /root/norm/rejects.ndjson — 파싱하지 못한 줄을 원문과 줄 번호로 격리하세요.
7. /root/norm/all.ndjson — 셋을 공통 스키마로 합쳐 시간순으로 세우세요.
8. /root/norm/norm_report.md — 정규화 규칙과 버린 줄을 보고서로 남기세요.
참고
- 모든
ts는 UTC 로 바꾸어2026-03-05T05:22:31.118Z모양으로 적습니다 — 날짜와 시각 사이에 대문자T, 밀리초 세 자리, 끝에 대문자Z. - 파이썬의
datetime.strptime은%z로+09:00과+0900을 모두 읽습니다. Combined 로그의 시각은%d/%b/%Y:%H:%M:%S %z로 읽히는데, 이때 로캘이 C 여야Mar이 해석됩니다. - syslog 의
<134>는 PRI 입니다. facility 는 8로 나눈 몫, severity 는 나머지입니다. - 흔한 실수: 스택트레이스 줄을 독립 레코드로 세기, 응답시간을 초 단위 실수 그대로 두기, 파싱 못 한 줄을 조용히 건너뛰기, 시각을 UTC 로 바꾸지 않고 문자열로 정렬하기.
- 이 실습의 산출물은 전부
/root/norm/아래에 모읍니다. 세션이 끝나면 사라지므로 중요한 것은 화면에 남겨 두세요.
단계 8개
- 고객사 로그 묶음 재현하기
- 줄 수와 레코드 수를 갈라 세기
- 여러 줄 예외를 한 레코드로 묶기
- 접근 로그를 구조화하기
- PRI 를 facility 와 severity 로 가르기
- 파싱 못 한 줄을 버리지 않고 격리하기
- 세 원본을 공통 스키마로 합치기
- 정규화 규칙을 문서로 남기기