A pesquisa no arquivo iptables.log leva muito tempo

A pesquisa no arquivo iptables.log leva muito tempo

Eu usei o iptables para salvar informações sobre conexões, modificando o /etc/syslog.confarquivo para salvar informações em formato /var/log/iptables.log.

Então, a cada X horas, preciso extrair informações do arquivo de log. Mas o problema é que o arquivo ficará maior e a busca será mais lenta. Então eu usei:

sed -i '/string/d' iptables.log

Para deletar o que não preciso mais. Mas quando eu uso este comando, o iptables para de salvar dados no iptables.logarquivo.

Então, oque há de errado? Como posso resolver esse problema?

Responder1

tente talvez um

cat iptables.log | sed -n "/PatternYouLookat/ p"

então você não bloqueia o arquivo durante o sed

em arquivos grandes, o sed tem desempenho ruim, então tente primeiro executar o grep no arquivo ou (o que eu faço) manter um marcador/índice para que você siga este e trate apenas o final do arquivo (mesmo com uma cópia temporária se o tratamento for pesado).

você poderia usar o sed -u para funcionar como um fluxo e evitar algum problema de buffer em arquivos enormes

Responder2

Eu acho que você está usando o syslog. E estou assumindo que sed in-place edit realmente cria um novo arquivo e remove o antigo.

O Syslog é muito frágil se você girar/recriar os arquivos de log sem notificá-lo. O que você vê é exatamente o que acontece: o syslog não registra nada no arquivo, mesmo que ele exista. Isso ocorre porque o syslog ainda possui o identificador de arquivo antigo e grava no arquivo antigo (mesmo que você não possa mais vê-lo com ls etc). Assim que o syslog fecha esse identificador de arquivo, os dados desaparecem no nirvana.

Eu recomendaria que o devnull usasse o logrotate. Se você não quiser, emita uma recarga do syslog ou reinicie após sua chamada sed. Esperamos que isso funcione.

Responder3

Use logrotate. Normalmente você alterna todas as noites ou todas as semanas, mas pode alterar isso para o que precisar. O único problema é que isso pode significar que o iptables precisa ser reiniciado após a rotação, que é tratada pelo logrotate. Não sei se isso é necessário, nem se isso (ou a frequência) é um problema para você ou para sua aplicação.

Logrotate cria um novo arquivo de log e renomeia os antigos. Você pode mantê-los todos ou excluí-los automaticamente depois de um tempo. Os arquivos girados podem ser alterados sem problemas, pois não são mais usados ​​para registro.

  • Digamos que você tenha um arquivo de log access.log.
  • Logrotate normalmente renomeia isso para access.log-20140729.
  • Em vez de uma data você pode usar um número: access.log.1.
  • Você pode executar outro cronscript que muda access.log.1usando sed.
  • Na próxima rotação, este arquivo é renomeado para access.log.2, com todas as suas alterações.
  • O mais recente access.logfoi renomeado para access.log.1, que pode então ser alterado por sed.
  • Um novo access.logé criado, etc etc...

informação relacionada