로그 문을 작성하기 전에 필터링하세요.

로그 문을 작성하기 전에 필터링하세요.

관심 있는 정보를 얻기 위해 상세 모드에서 실행해야 하는 애플리케이션이 있습니다. 이로 인해 내 요구 사항에 대한 관심도가 1% 미만인 거대한 로그 파일이 생성됩니다. 나는 관심 있는 진술만 기록할 수 있는 방법을 원합니다.

이 명령은 로그를 기록할 로그 파일 이름을 허용합니다. 시스템 서비스로 실행됩니다.

로그 쓰기 문이 디스크에 기록되기 전에 어떻게 가로채고 선택할 수 있나요?

fifo에 파일 이름을 지정하고 Python 스크립트를 통해 읽어 보았지만 너무 많은 문제가 발생했습니다.

답변1

fifo에 파일 이름을 지정하고 Python 스크립트를 통해 읽어 보았지만 너무 많은 문제가 발생했습니다.

이것은적어도모피 옵션. 모든 합리적인 접근 방식에는 grepPython 스크립트를 사용하든 syslog-ng를 사용하여 수동으로 수행하든 상관없이 스트림 필터 도구를 통해 출력을 파이핑하는 것이 포함됩니다 . 필터가 해야 할 일은 입력에서 한 줄을 읽고 이를 출력에 쓰는 것뿐입니다.

라이브러리 함수(예: fwrite() 또는 syslog())에 대해 LD_PRELOAD 필터링을 수행할 수 있지만 다음 프로그램에서만 작동하는 라이브러리:사용libc에서 제공하는 기능; 많은 언어 런타임은 libc fwrite()를 사용하지 않으며(예: Golang에는 자체 stdio가 있음) LD_PRELOAD는 정적으로 링크된 실행 파일에 영향을 미치지 않습니다.

ptrace()나 eBPF 또는 FUSE를 사용하여 OS 수준에서 write() 시스템 호출을 가로채면 이를 방지할 수 있지만 파일 쓰기는 일반적으로 프로그램에 의해 버퍼링되므로 이는 더 문제가 됩니다. line write( )에는 8k 버퍼당 하나의 write() 호출이 있으며 일반적으로 한 줄의 중간에서 시작하여 여러 줄에 걸쳐 있습니다. 예를 들어 단일 write() 호출에는 7개 반 라인이 포함될 수 있으므로 이를 가로채면 전체 호출을 수락/삭제할 수 없으며 필요한 라인만 유지하려면 버퍼를 분할하고 재조립해야 합니다. , 분할 줄을 처리하기 위해 상태를 유지하는 이 모든 Python당신을 위해 해냈습니다.

(이는 systemd가 어떤 용도로 seccomp와 eBPF를 사용하더라도 stdout/stderr이 아니라 프로그램 자체에서 연 파일에서 일부 데이터를 마술처럼 필터링하는 systemd 매개변수를 찾을 수 없음을 의미합니다. systemd는 확실히 관련되지 않습니다.)

관련 정보