Tengo un programa de Linux que puede escribir información en stdout y stderr.
Tengo un script de shell que redirige esa salida a un archivo /var/log
. (Vía >>
y 2>&1
.)
¿Hay alguna manera de hacer que ese archivo de registro gire? (tamaño máximo, luego cambie a un archivo diferente, mantenga solo un número limitado de archivos)
He visto algunas respuestas que hablan sobre el logrotate
programa, que suena bien, pero también parecen centrarse en programas que generan archivos de registro internamente y manejan señales HUP. ¿Hay alguna manera de hacer que esto funcione con un script de redirección de salida básico?
logrotate
si hay una mejor opción, que sonaba como un punto de partida conveniente para la discusión.Respuestas:
Como alternativa, puede canalizar la salida a través de herramientas diseñadas con el objetivo principal de mantener conjuntos de archivos de registro con límite de tamaño y rotación automática, como:
multilog
de Daemontoolsmultilog
de daemontools-encores6-log
de s6svlogd
de runittinylog
de perpcyclog
de noshLas herramientas para luego procesar
multilog
conjuntos de archivos de registro de formato incluyen, entre otros:multilog-watch
logrange
multilog-stamptail
follow-log-directories
de noshexport-to-rsyslog
de noshOtras lecturas
logrotate
ninewsyslog
en este siglo. . Respuestas frecuentes.fuente
multilog
parece justo lo que necesitaba.multilog
ninguna parte crea o exige vínculos simbólicos. Es completamente neutral con respecto a ellos.la
rotatelogs
herramienta enviada con apache (en elbin
directorio) (ver documentos ) toma la entrada de stdin y gira el registro después de un período de tiempo específicofuente
Si puede hacer que vaya a una de las secuencias de registro estándar (syslog, daemon, cron, usuario, seguridad, correo, etc.), puede usar el
logger
comando y canalizarlo.De lo contrario, es mejor que canalice su contenido registrado a un programa o script personalizado para manejarlo, o busque configurar la
logrotate
configuración.EDITAR: la respuesta de JdeBP parece tener lo que puede estar buscando.
fuente
Tuve un problema similar e inicialmente descarté logrotate pero resultó que logrotate realmente puede hacerlo bien, la directiva clave es " copytruncate ". Por alguna razón, ese término no apareció en ninguno de los google que hice, por lo que estoy agregando esta respuesta para aclarar exactamente cómo usarlo para este caso.
El truco es que esto solo funciona si la redirección se realiza con " >> " (agregar) en lugar de " > " (crear).
Archivo de configuración (truncate.cfg):
Programa de prueba (nunca abandona el archivo). Puede verlo llenando el disco y aunque eliminar el archivo de registro parece funcionar, en realidad no liberará espacio en el disco:
Ejecutar registro rotar:
fuente
echo /dev/urandom >> /tmp/temp.log
escribirá 13 caracteres deterministas/tmp/temp.log
y luego saldrá inmediatamente. Quiso decircat /dev/urandom
?¡Si! Consulte la directiva "copytruncate" que ofrece logrotate. Especificar que instruye a logrotate para manejar esta misma situación: un programa simple que mantiene su archivo de registro abierto indefinidamente.
Una advertencia puede o no ser un problema en su situación:
Como anécdota, he visto algunas fuentes de registro del "mundo real" que alientan a los usuarios a aplicar esta directiva. Hay un poco de discusión de esta opción aquí .
fuente
Use split, es parte de coreutils. Puede tomar stdin y dividirlo en fragmentos (según el tamaño del fragmento o el número de líneas, etc.).
Ejemplo:
Nota guión (-) indica a "split" que use stdin en lugar de archivo.
fuente
split
tiene datos en lo que podría ser un gran búfer. Dado que hay varias herramientas que resuelven este problema correctamente, no creo que este tipo de solución de rodar su propia cuenta pueda ser recomendada.Me gusta
multilog
para mi caso de uso, pero mi caso de uso es tan trivial / simple que no se presenta de manera muy simple en los documentos / ejemplos que encontré. Aquí hay un ejemplo simple de rotación multilog:Algunas notas:
"Note that running processor may block any program feeding input to multilog."
donde 'procesador' es la'!tai64nlocal'
parte del comando* Para muchas aplicaciones, estas son malas elecciones para uso a largo plazo. Permiten observar el comportamiento de llenar y rotar los registros más rápidamente que los registros grandes.
Finalmente, ¡no olvides nohup si es necesario! Con nohup, no necesita el
2>&1
(s = 10e6 yn = 30 aquí):Ese comando debería ayudarte a comenzar.
fuente
Solo quería agregar al comentario de Sam Hendley arriba:
El truco es que esto solo funciona si la redirección se realiza con
>>
(agregar) en lugar de>
(crear).Me encontré con el mismo problema en el que el archivo original sigue creciendo si usa
>
(crear) pero si usa>>
(agregar) Logrotate copytruncate funciona de maravilla y como se esperaba. El archivo original vuelve a cero bytes y el programa continúa escribiendo.Redireccionar STDOUT y STDERR a un archivo de registro giratorio:
some-program.sh >> /tmp/output.txt 2>&1 &
Crear un archivo de configuración logrotate bajo
/etc/logrotate.d
llamado whatever, output_roll en mi caso.Configuración de muestra para mi caso:
Configura tu trabajo cron dentro del
/etc/crontab
archivoEsto verificará el archivo cada minuto. Puede ajustarse a sus necesidades.
Ponlo en marcha:
Eso es
Nota: También tuve un problema con SELinux configurado,
SELINUX=enforcing
así que lo configuréSELINUX=disabled
.fuente
Escribí un logrotee este fin de semana. Probablemente no lo haría si hubiera leído la gran respuesta de @ JdeBP y
multilog
.Me centré en que fuera ligero y capaz de bzip2 sus fragmentos de salida como:
Sin embargo, todavía hay mucho por hacer y probar.
fuente