awk 또는 기타 cli 도구를 사용하여 로그 줄에서 json 필드를 추출합니다.

awk 또는 기타 cli 도구를 사용하여 로그 줄에서 json 필드를 추출합니다.

이는 현재 우리가 사용하고 있는 시스템의 로그 형식으로, 현재 전체 시스템의 로그 형식을 변경하는 것은 쉽지 않습니다. 로그와 해당 필드에서 json 개체를 추출하는 방법이 필요합니다. 현재 메시지 크기가 너무 크기 때문에 이렇게 하면 로그를 더 쉽게 볼 수 있습니다.

로그 형식입니다

A B C {"field name one":value of field , "msg": "a sample message", "c": c}

샘플 로그입니다. A, B, C 필드에는 공백이 없지만 json 객체의 필드와 값에는 공백이 있을 수 있다는 점에 유의하세요.

service_name/syslog.log:2022-09-24T16:18:01.38754199Z stdout F {"level":"info","ts":1664036281.3874626,"msg":"system sample message","host":"host_name","processor":"test","reqId":"1234"}

cli를 통해 msg의 값을 인쇄하고 싶습니다. 어떻게 해야 하나요?

답변1

jqJSON을 조작하기 위한 일반적인 도구입니다. jq -r .msgJSON 문서에 있는 키의 디코딩된 값을 반환합니다 .msg

필드 4( ) cut부터 필드를 추출하여 JSON 데이터를 얻을 수 있습니다 .cut -d ' ' -f 4-

따라서 다음을 결합하십시오.

cut -d ' ' -f 4- | jq -r .msg

예를 들어

echo '2022-09-24T16:18:01.38754199Z stdout F {"level":"info","ts":1664036281.3874626,"msg":"system sample message","host":"host_name","processor":"test","reqId":"1234"}' | cut -d ' ' -f 4- | jq -r .msg
system sample message

답변2

$ jq -r -R 'sub("[^{]*"; "") | fromjson.msg' file
system sample message

jq이는 입력을 "원시" 텍스트 줄 집합으로 읽는 데 사용됩니다 . 텍스트의 각 줄은 첫 번째 줄 앞의 내용을 제거하기 위해 sub()in으로 잘립니다 . 그런 다음 나머지 텍스트를 JSON 개체로 변환하고 개체의 값을 추출하는 데 사용합니다.jq{fromjsonmsg

답변3

사용행복하다(이전 Perl_6)

...Raku의 JSON::Tiny모듈을 사용하여:

~$ raku -MJSON::Tiny -ne 'my %json = from-json($_.comb( / "\{" ~ "\}" .* / )); 
                          put %json{"msg"};'   file.txt

또는:

~$ raku -MJSON::Tiny -ne '$_.comb( / "\{" ~ "\}" .*  / ) andthen  
                          my %json = from-json($_); 
                          put %json{"msg"};'   file.txt

또는:

~$ raku -MJSON::Tiny -ne 'put %(from-json($_.comb( / "\{" ~ "\}" .*  / ))){"msg"};  file.txt

참고: 위 코드 $_.comb는 로 축약될 수 있습니다 .comb. Raku의 앞에 점이 .일반적입니다. 이는 테마 변수 다음에 루틴을 호출하는 것을 의미합니다 $_.


위에서는 Raku 프로그래밍 언어를 사용하여 JSON 콘텐츠를 추출했습니다. -ne한 줄씩 자동 인쇄되지 않는 플래그를 사용하여 입력을 한 줄씩 읽습니다. 입력한 comb텍스트는 중괄호로 묶인 0개 이상의 (탐욕스러운) 문자 패턴과 일치합니다("물결표" 표기법, 아래 링크 참조). 이 방법을 사용하여 텍스트를 구문 분석 from-json($_)하고 결과를 %서명된 해시 %json(이전 두 답변)에 저장합니다.

최종 출력 결과:msg 열쇠관련 항목을 반환하기 위한 역참조. put %json<msg>대신 큰따옴표 형식을 사용 하고 하나를 추가하여 or next필수 msg키 없이 줄을 건너뛸 수 있습니다.

입력 예:

service_name/syslog.log:2022-09-24T16:18:01.38754199Z stdout F {"level":"info","ts":1664036281.3874626,"msg":"system sample message","host":"host_name","processor":"test","reqId":"1234"}

예제 출력:

system sample message

참고: 때로는 언어의 내부 데이터 표현을 살펴보는 것이 도움이 되므로 전체 %json해시는 다음과 같습니다( .say for %json.sort마지막 문 사용).

host => host_name
level => info
msg => system sample message
processor => test
reqId => 1234
ts => 1664036281.3874626

https://docs.raku.org/언어/regexes#Tilde_for_nesting_structs
https://raku.land/cpan:MORITZ/JSON::Tiny
https://raku.org

관련 정보