Classificar e fazer backup dos arquivos log4j

1

Peço desculpas pela duração dessa pergunta. É difícil explicar, apesar de eu ser fluente em inglês, o que não sou;)
Não tenho certeza onde postar essa questão, pois tem java, log4j library e linux.

Cenário:

Eu tenho vários arquivos de log (criados por log4j usando RollingFileAppender ). Nomeado file.log e file.log.1 para file.log.10
Todos os arquivos são sobrescritos mais de uma vez por dia. Quer dizer, se eu recebo uma incidência, tenho quase certeza de que não tenho registros para ver o que aconteceu, porque seria sobrescrito.

Propósito:

Meu objetivo é fazer um backup desses arquivos periodicamente, com algumas condições

  • Primeiro, não perca dados (resolveu executar um trabalho com frequência suficiente)
  • Não repita informações. (isso seria resolvido se as informações fossem classificadas)
  • Os dados devem ser classificados. (Problema !!)

Considerações:

  • Cada arquivo separado é classificado, mas não todos juntos, porque há duas instâncias do servidor que gravam para eles.
    Quero dizer que é possível uma instância escrever para * .log.1 e o outro * .log.2 de uma só vez. Então, eu não posso mesclar todos eles e esperar mantê-los separados.
  • Não consigo aumentar o espaço disponível no sistema de arquivos.

Layout do registro de log:

Cada linha é assim:

2014-11-28 14:33:10,015 main ca.cpy.net.txc.batch.SendEER INFO - information

Tentativas:

  1. Mover de RollingFileAppender para DailyRollingFileAppender como tipo de anexador. Infelizmente, a documentação do Apache diz

    "DailyRollingFileAppender has been observed to exhibit synchronization issues and data loss".

    Então, não posso usá-lo.

  2. Use as bibliotecas extras do apache log4j, mas não posso fazer isso. Não depende de mim.
  3. Faça tudo sozinho. Consiste em:

    • mesclar todos os arquivos
    • ordene-os
    • descarta todos os dados salvos nos backups anteriores.
    • comprimir


    O problema é a etapa de classificação. Isso é o que eu tentei:

    for ((i=10; i >= 1; i--)); do 
        cat file.log.$i >> $FILE_OUT;  ## put all files in one (as much sorted as possible)
    done;  
    cat file.log >> $FILE_OUT;  ## append last 
    sort -s -t ' ' -k 1.1,1.4n -k 1.6,1.7n -k 1.9,1.10n -k 2.1,2.2n -k 2.4,2.5n -k 2.7,2.8n -k 2.10,2.12n -3k $FILE_OUT -o $FILE_SORTED # Sort by date/time
    


    Bem, isso funcionaria se cada registro anexado ao log tivesse uma única linha (ou seja: nenhum caractere de fim de linha \ n). Por exemplo, tal comando de classificação acima quebraria um registro como este:

    2014-11-28 14:33:10,015 main ca.cpy.net.txc.batch.SendEER INFO  - 
     ***** RESULTATS ENVIAMENT EXPEDIENT ***** 
        Total documents a tractar en DB: 86
     ***************************************** 
    

    Classificaria apenas a primeira linha, e as outras três seriam colocadas no início do arquivo de saída.

Existe uma maneira de classificar arquivos mesclados sem quebrar cada registro que contém mais de uma linha? Qualquer outra ideia será muito bem-vinda também.

    
por Albert 03.12.2014 / 14:51

1 resposta

1

Aqui está uma maneira:

Torne os arquivos de log NUL -delimited. Isto é, faça com que cada registro termine com um caractere NUL ( NUL ). Em seguida, você pode aproveitar o suporte para o texto sed -delimited encontrado em várias ferramentas ( sort , xargs , find , NUL , etc.). Uma maneira poderia ser fazer:

perl -pe 's/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/
sort -szt ' ' -k1,2 file.log{.{10..1},}.NULL -o $FILE_SORTED
$1/' file.log.2 > file.log.2.NULL
  • Prefira todos os registros de data e hora com -s (é o contrário - fazer registros começarem com -z , mas com efeito ...)

Então você pode fazer:

perl -pe 's/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/
perl -pe 's/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/
sort -szt ' ' -k1,2 file.log{.{10..1},}.NULL -o $FILE_SORTED
$1/' file.log.2 > file.log.2.NULL
$1/' file.log{.{10..1},} | \ sort -szt ' ' -k1,2 -o $FILE_SORTED
  • NUL é para uma classificação estável (para que as entradas vinculadas sejam ordenadas por ordem)
  • YYYY-MM-DD HH:MM:SS,UUU ativa o suporte ao texto %code% -dimimited
  • Alterei as chaves, pois, como observei nos comentários, os registros de data e hora do formulário %code% são lexicograficamente classificáveis. Você não precisa de classificação numérica para eles.

Ou você pode evitar todos esses arquivos temporários:

perl -pe 's/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/%pre%$1/' file.log{.{10..1},} | \    
 sort -szt ' ' -k1,2 -o $FILE_SORTED
    
por 03.12.2014 / 18:30

Tags