Como posso remover entradas de log antigas de um arquivo de log e arquivá-las em algum outro lugar no Linux?

2

CentOS 4.x

Peço desculpas antecipadamente se este não é o lugar apropriado para fazer esta pergunta. Refere-se a uma tarefa de administração do servidor linux / IT.

Eu tenho um arquivo de log em um servidor antigo do CentOS 4.xe desejo remover entradas de log anteriores a uma determinada data e colocá-las em um novo arquivo para arquivamento.

Veja um exemplo do formato de registro:

2012-06-07 22:32:01,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:32:03,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:32:04,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|
2012-06-07 22:32:10,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:32:12,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:32:15,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|
2012-06-07 22:32:40,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:32:58,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:33:01,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|
2012-06-07 22:33:01,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|blah blah blah
2012-06-07 22:33:02,289 ABC:0|Foo|Foo2|4.4|1234|Some Event|123|

Essencialmente, estou procurando uma linha única que faça o seguinte:

  1. Encontre eventos mais antigos que o AAAA-MM-DD fornecido e remova-os do arquivo de log principal.
  2. Tire os eventos excluídos da etapa 1 e coloque -los em um novo arquivo de log
  3. (Opcional) Compacte o novo arquivo de log de arquivamento que contém os eventos excluídos.

Estou ciente de que existem ferramentas de rotação de log que fazem isso, mas isso deve ser apenas uma tarefa única, então prefiro não configurá-lo.

Notas adicionais:

  • Se a parte da data for complicada ou exigir muitos recursos, uma alternativa seria apenas manter o último número X de linhas e mover o restante. Eu estava originalmente pensando em algo como tail -n 10000 > newfile.txt , mas isso significaria mover os logs "bons" para um novo arquivo e, em seguida, fazer uma troca de nome ... e ainda precisaria remover as entradas "boas" do arquivo morto. .
  • Esse arquivo de log específico é muito grande (1 GB), portanto, prefiro que a tarefa seja o mais eficiente e eficiente possível.
  • Os tubos extras no registro me preocupam e eu não tenho certeza se precisaria de proteção extra nos comandos para evitar que isso cause problemas.
por Mike B 07.12.2012 / 22:51

1 resposta

2

Algo simples pode funcionar para você.

Supondo que as entradas de log estão em uma única linha e as linhas sempre começam com YYYY-MM-DD , um script simples como este dividiria o arquivo de registro por data.

logsplit: use cat arquivo de log | logsplit

#!/bin/bash
LOGBASEPATH=/logfilepath/logfile
while read LOGLINE ; do
  [[ -z ${LOGLINE} ]] && continue # skip empty
  dayprefix='echo $LOGLINE | cut -d ' ' -f 1'
  echo $LOGLINE  > $LOGBASEPATH/logname.$dayprefix
done

Isso combinaria muito bem com a opção dateext do logrotate para que você possa ter um arquivo de log por dia.

    
por 07.12.2012 / 23:24