`jq`로 GitLab 로그 파싱
jq 명령줄 도구를 사용하여 JSON 형식의 GitLab 로그를 파싱하고 분석하는 방법을 설명합니다.
가능하면 Kibana 나 Splunk 같은 로그 집계·검색 도구를 사용할 것을 권장하지만, 이러한 도구를 사용할 수 없더라도 JSON 형식의 GitLab 로그 를 jq 로 빠르게 파싱할 수 있습니다. Note 오류 이벤트와 기본 사용 통계를 요약하는 용도로는 GitLab 지원 팀이 전용 도구인 fast-stats 도구 를 제공합니다. 이 도구는 대개 jq 보다 큰 로그를 훨씬 빠르게 처리하고 더 다양한 통계 정보를 출력합니다. JQ 개요 # 매뉴얼 에 나와 있듯이 jq 는 명령줄 JSON 프로세서입니다. 다음 예시는 GitLab 로그 파일 파싱을 대상으로 하는 사용 사례를 담고 있습니다. 로그 파싱 # 아래 예시는 각 로그 파일을 Linux 패키지 설치 기준의 상대 경로와 기본 파일 이름으로 지칭합니다. 각각의 전체 경로는 GitLab 로그 섹션 에서 확인합니다. 압축된 로그 # 로그 파일이 회전 되면 Unix 타임스탬프 형식으로 이름이 바뀌고 gzip 으로 압축됩니다. 결과 파일 이름은 @40000000624492fa18da6f34.s 와 같습니다. 이러한 파일은 파싱하기 전에 최근 로그 파일과 다르게 처리해야 합니다. 파일 압축을 풀려면 gunzip -S .s @40000000624492fa18da6f34.s 를 사용하고, 파일 이름은 압축된 로그 파일의 이름으로 바꿉니다. 파일을 직접 읽거나 파이프로 넘기려면 zcat 또는 zless 를 사용합니다. 파일 내용을 검색하려면 zgrep 을 사용합니다. 일반 명령 # 색상화된 jq 출력을 less 로 파이프 # jq . -C | less -R 용어 검색 및 일치하는 모든 줄 예쁘게 출력 # grep | jq . JSON의 잘못된 줄 건너뛰기 # jq -cR 'fromjson?' file.json | jq 기본적으로 jq 는 유효한 JSON 이 아닌 줄을 만나면 오류를 냅니다. 이 명령은 유효하지 않은 줄을 모두 건너뛰고 나머지를 파싱합니다. JSON 로그의 시간 범위 출력 # cat log.json | (head -1; tail -1) | jq '.time' 파일이 회전되어 압축된 경우에는 zcat 을 사용합니다. zcat @400000006026b71d1a7af804.s | (head -1; tail -1) | jq '.time' zcat some_json.log.25.gz | (head -1; tail -1) | jq '.time' 여러 JSON 로그에서 상관 관계 ID에 대한 활동을 시간 순서로 가져오기 # grep -hR <correlationID> | jq -c -R 'fromjson?' | jq -C -s 'sort_by(.time)' | less -R gitlab-rails/production_json.log 및 gitlab-rails/api_json.log 파싱 # 5XX 상태 코드가 있는 모든 요청 찾기 # jq 'select(.status >= 500)' 가장 느린 요청 상위 10개 # jq -s 'sort_by(-.duration_s) | limit(10;