2010-08-05 8 views
9

Yo trabajo con algún sistema de registro que crea un archivo de registro cada hora, como sigue:Cómo tail-f el último archivo de registro con un patrón dado

SoftwareLog.2010-08-01-08 
SoftwareLog.2010-08-01-09 
SoftwareLog.2010-08-01-10 

Estoy tratando de cola para seguir la última archivo dando un patrón de registro (por ejemplo SoftwareLog *) y me di cuenta de que hay:

tail -F (tail --follow=name --retry) 

pero que sólo siga un nombre específico - y estos tienen diferentes nombres por fecha y hora. He intentado algo así como:

tail --follow=name --retry SoftwareLog*(.om[1]) 

pero la declaración comodín es resoved antes de que se pasa a la cola y no vuelve a ejecutar reintentos de la cola cada vez.

¿Alguna sugerencia?

Respuesta

6

[Editar: después de un google rápido para una herramienta]

Es posible que desee probar multitail - http://www.vanheusden.com/multitail/

Si desea seguir con la respuesta de Dennis Williamson (y he hecho +1 él en consecuencia) aquí están los espacios en blanco completados para usted.

En su shell, ejecute el siguiente script (o su equivalente zsh, Azoté esto en bash antes de ver la etiqueta zsh):

#!/bin/bash 

TARGET_DIR="some/logfiles/" 
SYMLINK_FILE="SoftwareLog.latest" 
SYMLINK_PATH="$TARGET_DIR/$SYMLINK_FILE" 

function getLastModifiedFile { 
    echo $(ls -t "$TARGET_DIR" | grep -v "$SYMLINK_FILE" | head -1) 
} 

function getCurrentlySymlinkedFile { 
    if [[ -h $SYMLINK_PATH ]] 
    then 
     echo $(ls -l $SYMLINK_PATH | awk '{print $NF}') 
    else 
     echo "" 
    fi 
} 

symlinkedFile=$(getCurrentlySymlinkedFile) 
while true 
do 
    sleep 10 
    lastModified=$(getLastModifiedFile) 
    if [[ $symlinkedFile != $lastModified ]] 
    then 
     ln -nsf $lastModified $SYMLINK_PATH 
     symlinkedFile=$lastModified 
    fi 
done 

Antecedentes que procesan utilizando el método normal (de nuevo, no se sabe zsh, por lo que podría ser diferente) ...

./updateSymlink.sh 2>&1 > /dev/null

Entonces tail -F $SYMLINK_PATH de modo que la cola manos el cambio de la relación simbólica o una rotación del archivo.

Esto es un poco intrincado, pero no sé de otra manera de hacer esto con la cola. Si alguien más conoce una utilidad que maneja esto, déjelos dar un paso adelante porque me encantaría verlo yo también - aplicaciones como Jetty de manera predeterminada hacen registros de esta manera y siempre escribo un script de enlace simbólico ejecutado en un cron para compensar para ello.

[Editar: Se eliminó una 'j' errónea del final de una de las líneas.También tuvo un mal nombre de la variable "lastModifiedFile" no existía, el nombre propio que ajuste es "lastModified"]

+0

gracias, podría tener que hacer eso. Miré en multitail, pero desafortunadamente solo es interactivo, lo que significa que no puedo canalizar su salida a otra parte. Lo intentaré y veré dónde me llega. La cuestión es que me gustaría que esto solo se ejecute cuando la cola se está ejecutando y salir cuando eso termine, y no estoy seguro de cómo hacerlo. – Axiverse

+0

¡Gracias! Esta es básicamente la única solución que me gusta (y busqué mucho para esto). –

+0

Neato. Editado para corregir un error que no funcionaría la primera vez para mí. (Debido a que getCurrentlySymlinkedFile devolvía una cadena vacía, y el error tipográfico era inexistente, lastModifiedDate también se evaluaba en una cadena vacía.) – funroll

2

No he probado esto, pero un enfoque que podría funcionar sería ejecutar un proceso en segundo plano que crea y actualiza un enlace simbólico al último archivo de registro y luego tail -f (o tail -F) el enlace simbólico.

11

creo que la solución más simple es el siguiente:

tail -f `ls -tr | tail -n 1` 

Ahora, si su directorio contiene otros archivos de registro como "SystemLog" y sólo desea que el último archivo "SoftwareLog", entonces sólo tendría que incluir un grep de la siguiente manera:

tail -f `ls -tr | grep SoftwareLog | tail -n 1` 
+6

o usa head en lugar de tail, para hacer las cosas más simples =) ls -t | cabeza -1 | xargs tail -F –

+0

O se puede utilizar: '' 'tail -f SoftwareLog'date + '% Y-% m-% d-% H''' '' –

0
#!/bin/bash 

PATTERN="$1" 

# Try to make sure sub-shells exit when we do. 
trap "kill -9 -- -$BASHPID" SIGINT SIGTERM EXIT 

PID=0 
OLD_FILES="" 
while true; do 
    FILES="$(echo $PATTERN)" 
    if test "$FILES" != "$OLD_FILES"; then 
    if test "$PID" != "0"; then 
     kill $PID 
     PID=0 
    fi 
    if test "$FILES" != "$PATTERN" || test -f "$PATTERN"; then 
     tail --pid=$$ -n 0 -F $PATTERN & 
     PID=$! 
    fi 
    fi 
    OLD_FILES="$FILES" 
    sleep 1 
done 

a continuación, ejecutarlo como: tail.sh 'SoftwareLog*'

La secuencia de comandos perderá algunas líneas de registro si los registros se escriben entre las comprobaciones. Pero al menos es una secuencia de comandos única, sin enlaces simbólicos necesarios.

Cuestiones relacionadas