LabHub
배우기 러닝패스 코스

로그로 원인 찾기 · 섞인 형식을 한 레코드로 · 실습

로그를 받았는데 세 가지 형식이 섞여 있었다

LabHub 에서 이어서 보기

목표

형식이 서로 다른 로그 파일 세 개를 한 줄 한 레코드의 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 — 정규화 규칙과 버린 줄을 보고서로 남기세요.

참고

단계 8개

  1. 고객사 로그 묶음 재현하기
  2. 줄 수와 레코드 수를 갈라 세기
  3. 여러 줄 예외를 한 레코드로 묶기
  4. 접근 로그를 구조화하기
  5. PRI 를 facility 와 severity 로 가르기
  6. 파싱 못 한 줄을 버리지 않고 격리하기
  7. 세 원본을 공통 스키마로 합치기
  8. 정규화 규칙을 문서로 남기기