NCSA 결합 기반 로그 파일을 구문 분석하는 방법

NCSA 결합 기반 로그 파일을 구문 분석하는 방법

site:저는 Server Fault, Super User 및 Stack Overflow에 대해 Google을 사용하여 약간의 검색을 수행했습니다 . 또한 사이트별 결과가 아닌 것을 확인했는데 이와 같은 질문을 실제로 보지 못했으므로 다음과 같습니다...

나는 발견했다grep 및 awk와 관련된 이 질문훌륭한 지식이 있지만 텍스트 자격 문제가 해결되었다고 생각하지 않습니다. 이 질문은 또한 모든 플랫폼과 프로그램으로 범위를 확장합니다.

NCSA 결합 형식을 기반으로 한 오징어 또는 아파치 로그가 있습니다. 내가 기반이라고 말하면 파일의 첫 번째 n 열이 NCSA 결합 표준에 따른다는 의미이며 사용자 정의 항목이 있는 열이 더 많을 수 있습니다.

다음은 오징어 결합 로그의 예시 라인입니다:

1.1.1.1 - - [11/Dec/2010:03:41:46 -0500] "GET http://yourdomain.com:8080/en/some-page.html HTTP/1.1" 200 2142 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; C) AppleWebKit/532.4 (KHTML, like Gecko)" TCP_MEM_HIT:NONE

n정렬, 계산, 고유 값 찾기 등을 위해 로그를 구문 분석하고 특정 열을 출력할 수 있기를 원합니다 .

주요 과제와 이를 다소 까다롭게 만드는 이유, 그리고 이 질문에 대해 아직 질문이나 답변이 이루어지지 않았다고 생각하는 이유는 다음과 같습니다.텍스트 자격 난제.

내가 발견했을 때SQLgrep/awk 질문에서 저는 매우 기뻤지만 기본적으로 결합된 기능을 지원하지 않는다는 것을 깨달았습니다. 확장을 살펴보겠습니다.

답변을 기대하고 새로운 것을 배워보세요! 답변은 플랫폼이나 프로그램/언어로 제한될 필요가 없습니다. 이 질문의 맥락에서 제가 가장 많이 사용하는 플랫폼은 Linux 또는 OSX입니다.

건배

답변1

Perl 사용, darwin-thread-multi-2level(OSX)용으로 구축된 v5.10.0에서 테스트됨

UserAgent 열을 인쇄하려면 다음을 수행하십시오.

perl -n -e '/^([^ ]+) ([^ ]+) ([^ ]+) (\[[^\]]+\]) "(.*) (.*) (.*)" ([0-9\-]+) ([0-9\-]+) "(.*)" "(.*)"/; print "$11\n"' -- test.log
  • 옵션은 -n각 줄에 있는 동안test.log
  • 옵션 -e한 줄 프로그램

나는 내가 검색한 Perlre를 훔쳐서 수정했습니다.PHP 요리책에서. $결합된 NCSA를 기반으로 하는 사용자 정의 형식을 지원하기 위해 끝에서 를 제거했습니다 . 패턴을 쉽게 확장하여 더 많은 그룹을 제공할 수 있습니다.

정규식 그룹은 ()로컬 변수로 종료됩니다 $1.$n

빠르고 지저분하며 확장 및 스크립트가 매우 쉽습니다.

출력 파이핑의 몇 가지 예:

  • | sort | uniq고유한 열 값
  • | sort | uniq | wc -l고유한 열 수

비판과 개선을 환영합니다

답변2

텍스트 제한을 직접적으로 다루지는 않지만 결합된 형식에서 활용할 수 있는 한 가지 요소는 공백으로 구분된 나머지 열이 일관되게 동일한 열에 있다는 것입니다. 따라서 printf 및 NF(열 수)와 함께 루프를 사용하여 문제를 해결할 수 있습니다.

awk에 따르면 $0은 전체 입력 라인이고, $1은 첫 번째 열, $2는 두 번째, $NF는 마지막 열입니다.

따라서 결합된 표준 NCSA의 경우 사용자 에이전트는 $13 열부터 $NF 열까지입니다.

첫 번째 열을 제거하고 수정된 로그 형식의 마지막 열로 바꿔야 했습니다(마지막 열에 프록시 IP가 추가됨).

따라서 반환되어야 하는 것은 $NF 열, 두 번째 열($2), 나머지 열부터 NF - 1입니다.

나는 다음을 통해 그렇게 할 수 있었습니다:-

awk '{ printf "%s ", $NF; for (i=2; i<=NF-1; i++) printf "%s ", $i; printf "\n";}' < /var/log/nginx/access.log

관련 정보