Concatenando logs do Apache gziped

1

Nós rotacionamos e compactamos nossos logs do Apache todos os dias, mas ficou claro que isso não é suficiente. Um log descompactado é de cerca de 6G, que está chegando perto de preencher nossa partição de log (sim, vamos torná-lo maior no futuro!), Bem como levar muito tempo e CPU para compactar a cada dia. Nós temos que produzir um log gziped para cada dia para o nosso processamento de estatísticas. Obviamente, poderíamos mover nossos logs para uma partição com mais espaço, mas também queremos distribuir a sobrecarga de compactação ao longo do dia.

Usando os rotatelogs do Apache, podemos girar e compactar o registro com mais frequência - por hora, digamos - mas como concatenar todos os registros compactados por hora em um log compactado em execução para o dia, sem descompactar os logs anteriores? Eu não quero descompactar dados de 24 horas e recomprimi-los porque isso tem todas as desvantagens de nossa solução atual.

O gzip não parece oferecer nenhuma opção de anexação ou concatenação, mas talvez eu tenha perdido algo óbvio. Esta questão sugere que a concatenação de shell direto "funciona", pois o arquivo pode ser descompactado, mas o gzip -l não funciona, parece um pouco desonesto.

Alternativamente, talvez isso ainda seja uma maneira ruim de fazer as coisas. Outras sugestões são bem-vindas - nossas únicas restrições são nossas partições de log relativamente pequenas e a necessidade de fornecer um log comprimido diário.

    
por markdrayton 19.08.2009 / 10:25

4 respostas

7

A página de manual do gzip deve ter o que você deseja, mas você pode concatenciá-los diretamente:

cat file1.gz >> file2.gz
gzip -c file1 >> file2.gz

A compactação não é tão boa como se fosse apenas um arquivo compactado, mas você pode recuperar com:

zcat old.gz | gzip > new.gz
    
por 19.08.2009 / 10:30
1

O gzip não se importa. Você pode concatenar arquivos gzipados e será exatamente como se você os tivesse concatenado e, em seguida, os compactado.

$ echo foo |gzip >/tmp/log.gz
$ echo bar |gzip >>/tmp/log.gz
$ zcat /tmp/log.gz
foo
bar
    
por 02.05.2010 / 19:12
0

Apenas coloque os arquivos compactados juntos. É efetivamente um concatenar e os mantém agrupados logicamente. A diferença no tamanho do arquivo entre fazer isso e descompactá-los / recomprimi-los juntos é praticamente zero.

Como em arquivos de log não-triviais, o compartilhamento de 24 arquivos de log juntos gera um arquivo virtualmente idêntico a um único arquivo gzipado de todos os 24 arquivos originais.

    
por 19.08.2009 / 11:04
0

A diretiva CustomLog permite que você especifique um comando para o qual os logs são canalizados, em vez do arquivo de log usual.

Você poderia, por exemplo, escrever um script de shell que simplesmente gzips tudo o que fica em stdin para um arquivo que você especificar como argumento:

#!/bin/sh
gzip -c >> $1

Provavelmente não é uma boa ideia combinar isso com rotatelogs , pois isso pode corromper o arquivo, mas você pode emular com relativa facilidade seu comportamento.

Então você configura o Apache assim:

Customlog "|/usr/local/bin/gzip_log.sh /var/log/apache/access.log" combined

Teste isso! O buffer de gzip pode ser um problema.

    
por 19.08.2009 / 11:23