He usado iptables para guardar información sobre conexiones modificando el /etc/syslog.conf
archivo 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.log
archivo.
¿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.1
usando 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.log
aaccess.log.1
, que luego se puede cambiar mediante sed. - Se crea un nuevo
access.log
, etc etc...