Eu usei o iptables para salvar informações sobre conexões, modificando o /etc/syslog.conf
arquivo 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.log
arquivo.
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.1
usando sed. - Na próxima rotação, este arquivo é renomeado para
access.log.2
, com todas as suas alterações. - O mais recente
access.log
foi renomeado paraaccess.log.1
, que pode então ser alterado por sed. - Um novo
access.log
é criado, etc etc...