매일 병합해야 하는 로그 파일이 여러 개 있습니다. 각각은 다른 서버에서 제공됩니다. 파일을 거기에 넣는 작업이 때때로 중단되고 파일이 잘립니다. 이 경우 파일은 다음에 실행될 때 다른 이름으로 기록됩니다. 따라서 다음과 같은 로그 파일 목록이 생성될 수 있습니다.
server-1-log.gz
(어제의 로그 파일)server-1-log.1.gz
(오늘의 로그 파일은 전송 중에 중단되어 잘렸습니다.)server-1-log.2.gz
(오늘의 로그파일은 재전송되어 그대로 남아있습니다)server-2-log.gz
(어제의 로그 파일)server-2-log.1.gz
(오늘의 로그 파일)
모든 로그 파일은 각 줄의 타임스탬프로 시작하므로 정렬 및 중복 제거가 매우 간단합니다. 다음 명령을 사용하여 이 파일들을 병합하려고 했습니다.
zcat *.gz | sort | uniq | gzip > /tmp/merged.gz
문제는 잘린 로그 파일이 다음 오류를 생성한다는 것입니다 zcat
.
gzip: server-1-log.1.gz: 예기치 않은 파일 끝
zcat에서 이 오류가 발생하면 다른 파일의 모든 데이터를 읽지 않고 완전히 종료되는 것으로 나타났습니다. 파일 중 하나가 손상되었기 때문에 좋은 파일에 있던 데이터가 손실되었습니다. 이 문제를 어떻게 해결할 수 있나요?
zcat
오류가 발생하여 종료되지 않도록 할 수 있나요 ? 매뉴얼 페이지에는 아무것도 표시되지 않습니다.- 호출하기 전에 잘린 gzip 파일을 수정할 수 있습니까
zcat
? - 다른 스트레스 감소 루틴을 사용할 수 있나요?
답변1
나는 당신이 사용하고 있는 gzip
스크립트 버전을 추측하고 있습니다 zcat
. 단지 실행되기만 gzip -dc
하며 오류가 발생하면 오류를 무시하고 중지하라는 지시를 받을 수 없습니다.
개별 손상된 아카이브에 대한 문서화된 수정 사항은 해당 아카이브를 실행하는 것이므로 zcat
거기에서는 많은 도움을 받을 수 없습니다...
파일을 처리하려면 파일을 반복하거나(루프 for
또는 xargs
찾은 것과 유사한 것을 사용) 다음을 사용할 수 있습니다.주틸스zcat
오류가 발생해도 계속 처리하는 버전이 있습니다 .
답변2
나는 이것을 할 수 있는 방법을 찾았습니다. 각 파일을 자체적으로 전달할 수 있습니다 zcat
. 이렇게 하려면 xargs -n 1
각 파일에 대해 zcat 인스턴스를 시작할 수 있습니다.
echo *.gz | xargs -n 1 zcat | sort | uniq | gzip > /tmp/merged.gz
단일 zcat은 여전히 실패하지만 다른 zcat 실행은 완료됩니다. 전체 파이프라인이 종료되지는 않습니다.
답변3
노력하다초고속 시스템 로그 검색기
(당신이 가지고 있다고 가정러스트 설치됨)
cargo install super_speedy_syslog_searcher
그 다음에
s4 server-*.gz
s4
파일을 읽을 수 있습니다 .gz
.