69 votos

La rotación de registro de salida estándar (stdout)?

Tengo un programa Linux que puede escribir la información a stdout y stderr.

Tengo un script de shell que redirige la salida a un archivo en /var/log. (A través de la >> y 2>&1.)

Es allí una manera de hacer que el archivo de registro de girar? (max tamaño, a continuación, cambiar a un archivo diferente, mantener sólo un número limitado de archivos)

Yo he visto un par de respuestas que hablan de la logrotate programa, que suena bien, pero también parece estar centrado en los programas que están generando los archivos de registro internamente y manejar HUP señales. Es allí una manera de hacer este trabajo con una base de redirección de salida de secuencia de comandos?

58voto

JdeBP Puntos 17351

Como alternativa, se podría canalizar la salida a través de herramientas diseñadas con el propósito principal de mantener el tamaño de cubiertas, gire automáticamente, el archivo de registro de conjuntos, tales como:

Herramientas para procesar, a continuación, multilog-formato de archivo de registro de conjuntos incluyen, entre otros:

19voto

BertNase Puntos 191

el rotatelogs herramienta se entregan con apache (en bin dir) (véanse docs) toma de entrada de stdin y gira el registro después de algún período de tiempo específico

15voto

Sam Hendley Puntos 141

He tenido un problema similar y tenía inicialmente descartar logrotate pero resultó logrotate pueden hacer esto bien, la clave de la directiva es "copytruncate". Por alguna razón, ese término no vienen en ninguna de las google me hizo, así que voy a añadir esta respuesta para aclarar exactamente cómo usarlo para este caso.

El truco es que esto sólo funciona si la redirección se realiza con ">>" (anexar) en lugar de ">" (crear).

Archivo de configuración (trunca.cfg):

/tmp/temp.log {
    size 10M
    copytruncate
    rotate 4
    maxage 100
}

Programa de prueba (nunca se da por vencido archivo). Usted puede ver el relleno de disco y a pesar de la eliminación de archivo de registro aparecerá al trabajo que en realidad no libera espacio en el disco:

echo /dev/urandom >> /tmp/temp.log

Registro de ejecución de rota:

logrotate truncate.cfg

14voto

bosnic Puntos 534

Si usted puede tener que ir a una de las secuencias de registro (syslog daemon cron, usuario, seguridad, correo, etc.) usted puede utilizar el logger comando y el tubo a la misma vez.

echo "Hello." | logger -p daemon.info

De lo contrario, usted puede ser mejor de tuberías de su sesión contenido a un programa o script personalizado para manejar, o mirar a la creación de la logrotate de configuración.

EDIT: JdeBP la respuesta parece tener lo que usted podría estar buscando.

3voto

natevw Puntos 111

Entonces, ¿hay una manera de hacer logrotate trabajar con un proceso continuo del redirige stdout?

Sí! Echa un vistazo al "copytruncate" directiva ofrecidos por logrotate. La especificación que indica logrotate para manejar esta situación: un programa sencillo, que mantiene su archivo de registro abierto de forma indefinida.

Una advertencia puede o puede no ser un problema en su situación:

Tenga en cuenta que existe un pequeño intervalo de tiempo entre copiar el archivo y truncar, por lo que algunas de registro de datos se pueden perder.

Como anécdota, he visto algunos "mundo real" registro de las fuentes que hacer para animar a los usuarios a aplicar la presente directiva. Hay una cierta discusión de esta opción aquí.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: