2010-08-05 4 views
9

ich mit einigem Log-System arbeiten, die eine Protokolldatei jeder Stunde erzeugt, wie folgt:zu tail -f der neuesten Protokolldatei mit einem bestimmten Muster

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

Ich versuche, bis zum Schwanz der neuesten zu folgen Protokolldatei ein Muster zu geben (zB SoftwareLog *) und ich merke, es gibt:

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

aber, dass nur einen bestimmten Namen folgen - und diese haben unterschiedliche Namen von Datum und Uhrzeit. Ich habe versucht, so etwas wie:

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

aber die Wildcard-Anweisung resoved wird, bevor es an Schwanz übergeben wird und nicht jedes Mal Schwanz Wiederholungen erneut auszuführen.

Irgendwelche Vorschläge?

Antwort

6

[Edit: nach einem schnellen googeln für ein Werkzeug]

Sie möchten vielleicht multitail ausprobieren - http://www.vanheusden.com/multitail/

Wenn Sie mit Dennis Williamson Antwort auf halten wollen (und ich habe + 1'ed Ihm entsprechend) hier sind die Lücken für dich ausgefüllt.

In der Shell, das folgende Skript ausführen (oder es ist zsh gleichwertig, ich gepeitscht dies in bash, bevor ich den zsh Tag sah):

#!/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 

Hintergrund, die das normale Verfahren Verfahren (wieder, ich nicht wissen, zsh, so dass es anders sein könnte) ...

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

Dann tail -F $SYMLINK_PATH so dass der Schwanz Hände, um die Änderung des symbolischen Link oder eine Rotation der Datei.

Dies ist ein wenig verschachtelt, aber ich kenne keine andere Möglichkeit, dies mit dem Schwanz zu tun. Wenn jemand anderes von einem Dienstprogramm weiß, das das handhabt, dann lasst sie einen Schritt vorwärts gehen, weil ich es gerne selbst sehen würde - Anwendungen wie Jetty loggen sich standardmäßig so ein und ich schreibe immer ein symlinking Skript, das auf einem Cron ausgeführt wird, um das auszugleichen dafür.

[Bearbeiten: Entfernte ein falsches 'j' vom Ende einer der Zeilen.Sie hatte auch einen schlechten Variablennamen „lastModifiedFile“ nicht gäbe, der richtige Name, den Sie festgelegt ist „lastModified“]

+0

danke, ich muss das vielleicht tun. Ich habe in Multitail geschaut, aber leider ist es nur interaktiv, was bedeutet, dass ich es anderswo nicht ausgeben kann. Ich werde es versuchen und sehen, wo ich komme. Die Sache ist, dass ich möchte, dass dies nur läuft, wenn der Schwanz läuft, und wenn er austritt, und ich bin mir nicht sicher, wie ich das machen soll. – Axiverse

+0

Danke! Dies ist im Grunde die einzige Lösung, die ich mochte (und ich habe viel nach diesem gesucht). –

+0

Neato. Bearbeitet, um einen Fehler zu beheben, wo es das erste Mal für mich nicht funktionieren würde. (Weil getCurrentlySymlinkedFile eine leere Zeichenkette zurück gab und das typo'd nicht existente lastModifiedDate auch zu einer leeren Zeichenkette ausgewertet wurde.) – funroll

2

Ich habe dies nicht getestet, aber ein Ansatz, der funktionieren könnte wäre, einen Hintergrundprozess, der erstellt und aktualisiert einen Symlink auf die neueste Protokolldatei und dann Sie tail -f (oder tail -F) Symlink.

11

Ich glaube, die einfachste Lösung ist wie folgt:

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

Nun, wenn Ihr Verzeichnis enthält andere Protokolldateien wie „SystemLog“ und Sie nur die neueste „SoftwareLog“ Datei wollen, dann würden Sie einfach ein grep sind wie folgt:

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

oder head anstelle von tail verwenden, um Dinge einfacher zu machen =) ls -t | Kopf -1 | xargs tail -F –

+0

Oder kann verwendet werden: '' '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 

dann führen Sie es als: tail.sh 'SoftwareLog*'

Das Skript verliert einige Protokollzeilen, wenn die Protokolle zwischen Prüfungen geschrieben werden. Aber zumindest ist es ein einzelnes Skript, ohne dass dafür symbolische Links erforderlich sind.

Verwandte Themen