Mesclar arquivos de log gzipados possivelmente truncados

0

Eu tenho vários arquivos de log de cada dia que eu preciso mesclar juntos. Cada um vem de um servidor diferente. O trabalho que os coloca lá às vezes é interrompido e os arquivos ficam truncados. Nesse caso, o arquivo é gravado com um nome diferente na próxima vez que for executado. Então eu posso acabar com uma lista de arquivos de log como:

  • server-1-log.gz (arquivo de log de ontem)
  • server-1-log.1.gz (o arquivo de log de hoje foi interrompido durante a transferência e está truncado)
  • server-1-log.2.gz (arquivo de log de hoje retransferido e intacto)
  • server-2-log.gz (arquivo de log de ontem)
  • server-2-log.1.gz (arquivo de log de hoje)

Todos os arquivos de log começam com um registro de data e hora em cada linha, portanto é bastante trivial classificá-los e desduplicá-los. Eu tenho tentado mesclar esses arquivos usando o comando:

zcat *.gz | sort | uniq | gzip > /tmp/merged.gz

O problema é que o arquivo de log truncado produz o seguinte erro de zcat :

gzip: server-1-log.1.gz: unexpected end of file

Acontece que zcat sai completamente quando atinge esse erro, sem ler todos os dados dos outros arquivos. Acabo perdendo os dados que existem nos outros arquivos bons porque um dos arquivos está corrompido. Como posso consertar isso?

  • Posso informar zcat para não sair nos erros? Eu não vejo nada na página de manual para isso.
  • Posso corrigir arquivos gzip truncados antes de chamar zcat ?
  • Posso usar um programa de descompressão diferente?
por Stephen Ostermiller 20.10.2017 / 17:10

2 respostas

1

Suponho que você esteja usando a versão do script gzip de zcat . Isso apenas executa gzip -dc , que não pode ser informado para ignorar erros e parar quando encontrar um.

A correção documentada para arquivos compactados corrompidos individuais é executá-los por meio de zcat , para que você não receba muita ajuda lá ...

Para processar seus arquivos, você pode fazer um loop sobre eles (com um for loop ou xargs como você encontrou) ou usar Zutils que tem uma versão de zcat que continua processando quando encontra erros.

    
por 20.10.2017 / 17:27
0

Eu encontrei uma maneira de fazer isso. Eu posso executar cada arquivo através de sua própria instância de zcat . Para fazer isso, posso usar xargs -n 1 para iniciar uma instância de zcat para cada arquivo:

echo *.gz | xargs -n 1 zcat | sort | uniq | gzip > /tmp/merged.gz

O único zcat ainda falha, mas os outros são executados até a conclusão. Não mata o cano inteiro.

    
por 20.10.2017 / 17:26