tail -f에서 awk, jq까지 로그 파일을 처리하는 방법은 무엇입니까?

tail -f에서 awk, jq까지 로그 파일을 처리하는 방법은 무엇입니까?

내 사용 사례는 다음과 같습니다. PHP에서 json 데이터만 기록하는 Apache 로그 파일이 있습니다. Apache가 로그를 인쇄하는 방식 때문에 awk를 사용하여 각 줄의 시작과 끝을 잘라야 합니다. 결과는 json 문자열이고 jq를 사용하여 예쁘게 인쇄하고 싶습니다.

tail에서 awk로 파이프하려면 stdbuf를 사용해야 합니다. 내가 생각해낸 전체 명령은 다음과 같습니다.

stdbuf -o0 tail -f  -n 1 /var/log/apache2/error.log | awk '{print substr($0,83, length($0)- 166); }' | jq 

이것은 작동하지 않습니다. 나는 그것이 jq 때문이라고 생각하지만 --stream 또는 --unbuffered도 작동하지 않습니다.

내가 원하는 것을 수행하는 방법을 아는 사람이 있습니까?

편집하다: JSON의 예는 다음과 같습니다.

{"foo": "bar"}

이는 올바르게 표시되지만 tail이 실행되는 동안 json이 작성되면 표시되지 않습니다.

답변1

방금 해결책을 찾았습니다. stdbuf -oO를 사용하여 각 명령을 "버퍼 해제"해야 합니다. 따라서 다음과 같아야 합니다.

stdbuf -o0 tail -f  -n 2 /var/log/apache2/error.log | stdbuf -o0 awk '{print substr($0,83, length($0)- 166); }' | jq

관련 정보