이는 현재 우리가 사용하고 있는 시스템의 로그 형식으로, 현재 전체 시스템의 로그 형식을 변경하는 것은 쉽지 않습니다. 로그와 해당 필드에서 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
jq
JSON을 조작하기 위한 일반적인 도구입니다. jq -r .msg
JSON 문서에 있는 키의 디코딩된 값을 반환합니다 .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
{
fromjson
msg
답변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