La búsqueda en el archivo iptables.log lleva mucho tiempo

La búsqueda en el archivo iptables.log lleva mucho tiempo

He usado iptables para guardar información sobre conexiones modificando el /etc/syslog.confarchivo para guardar información en formato /var/log/iptables.log.

Entonces, cada X horas, necesito extraer información del archivo de registro. Pero el problema es que el archivo será más grande y la búsqueda será más lenta. Entonces usé:

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

Para borrar lo que ya no necesito. Pero cuando uso este comando, iptables deja de guardar datos en el iptables.logarchivo.

¿Así que qué hay de malo? ¿Como puedó resolver esté problema?

Respuesta1

prueba tal vez un

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

para no bloquear el archivo durante el sed

en archivos grandes, sed tiene un rendimiento deficiente, así que intente primero grep el archivo o (lo que hago) mantenga un marcador/índice para seguir este y solo tratar la cola del archivo (incluso con una copia temporal si el tratamiento es pesado).

podrías usar sed -u para trabajar como una secuencia y evitar algún problema de búfer en un archivo enorme

Respuesta2

Supongo que estás usando syslog. Y supongo que la edición in situ de sed en realidad crea un archivo nuevo y elimina el anterior.

Syslog es muy frágil si rota/recrea los archivos de registro sin notificarlo. Lo que ve es exactamente lo que sucede: syslog no registra nada en el archivo aunque exista. Esto se debe a que syslog todavía tiene el identificador de archivo antiguo y escribe en el archivo antiguo (aunque ya no pueda verlo con ls, etc.). Tan pronto como syslog cierra este identificador de archivo, los datos desaparecen en el nirvana.

Recomendaría a devnull usar logrotate en su lugar. Si no lo desea, ejecute una recarga de syslog o reinicie después de su llamada sed. Con suerte, eso debería funcionar.

Respuesta3

Utilice logrotate. Normalmente rotas cada noche o cada semana, pero puedes cambiar esto según lo que necesites. El único inconveniente es que podría significar que iptables necesita reiniciarse después de rotar, lo cual es manejado por logrotate. No sé si eso es necesario, ni si eso (o la frecuencia) es un problema para usted o su aplicación.

Logrotate crea un nuevo archivo de registro y cambia el nombre de los antiguos. Puedes conservarlos todos o eliminarlos automáticamente después de un tiempo. Los archivos rotados se pueden cambiar sin problemas, porque ya no se utilizan para iniciar sesión.

  • Digamos que tiene un archivo de registro access.log.
  • Logrotate normalmente le cambia el nombre a access.log-20140729.
  • En lugar de una fecha puedes usar un número: access.log.1.
  • Puede ejecutar otro cronscript que cambie access.log.1usando sed.
  • En la siguiente rotación, este archivo cambia de nombre a access.log.2, con todos los cambios.
  • Se cambia el nombre del último access.loga access.log.1, que luego se puede cambiar mediante sed.
  • Se crea un nuevo access.log, etc etc...

información relacionada