GNU/Linux >> Linux Esercitazione >  >> Linux

Come eseguire il tail -f dell'ultimo file di registro con un dato modello

Non l'ho provato, ma un approccio che potrebbe funzionare sarebbe quello di eseguire un processo in background che crei e aggiorni un collegamento simbolico all'ultimo file di registro e quindi faresti tail -f (o tail -F ) il collegamento simbolico.


Credo che la soluzione più semplice sia la seguente:

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

Ora, se la tua directory contiene altri file di registro come "SystemLog" e desideri solo l'ultimo file "SoftwareLog", allora dovresti semplicemente includere un grep come segue:

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

[Modifica:dopo una rapida ricerca su Google di uno strumento]

Potresti voler provare multitail - http://www.vanheusden.com/multitail/

Se vuoi restare fedele alla risposta di Dennis Williamson (e gli ho fatto +1 di conseguenza) ecco gli spazi vuoti riempiti per te.

Nella tua shell, esegui il seguente script (o è l'equivalente zsh, l'ho montato in bash prima di vedere il tag 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

Sfondo di quel processo usando il metodo normale (di nuovo, non conosco zsh, quindi potrebbe essere diverso)...

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

Quindi tail -F $SYMLINK_PATH in modo che la coda porti il ​​cambio del link simbolico o una rotazione del file.

Questo è leggermente contorto, ma non conosco un altro modo per farlo con la coda. Se qualcun altro conosce un'utilità che gestisce questo, lascia che si faccia avanti perché mi piacerebbe vederlo anche io - applicazioni come Jetty per impostazione predefinita eseguono i log in questo modo e scrivo sempre uno script di collegamento simbolico eseguito su un cron per compensare per questo.

[Modifica:rimossa una "j" errata dalla fine di una delle righe. Avevi anche un nome di variabile errato "lastModifiedFile" non esisteva, il nome corretto che hai impostato è "lastModified"]


Linux
  1. Come modificare il percorso del file di registro auditd /var/log/audit/audit.log

  2. Come verificare l'integrità di un file con il checksum md5

  3. Shellscript per monitorare un file di registro se i trigger di parole chiave eseguono quindi un comando?

  4. Comando tr - come sostituire la stringa \n con una nuova riga effettiva (\n)

  5. Come posso installare l'ultimo Anaconda con wget

Come utilizzare il comando chgrp con esempi

Come trovare il processo con il numero massimo di descrittori di file?

Come trovare file con dozzine di criteri con il comando Trova Bash

HowTo:l'esercitazione definitiva sui comandi Logrotate con 10 esempi

Come stampare l'ultima riga di un file compresso gz nella riga di comando?

Come posso aggiornare all'ultima versione di PHP in CentOS con yum?