2010-08-05 29 views
9

我有一些日誌系統中工作,其每隔一小時創建日誌文件中最新的日誌文件,就像如下:如何尾-f與給定的模式

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

我試圖尾巴跟隨最新日誌文件給人一種模式(例如SoftwareLog *)和我意識到人們:

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

但只能跟着一個特定的名稱 - 這些都按日期和時間不同的名稱。我想是這樣的:

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

,但它被傳遞到尾之前,不會重新執行每次尾重通配符語句resoved。

有什麼建議嗎?

回答

6

[編輯:一個快速谷歌搜索工具後]

你可能想嘗試multitail - 如果你想堅持丹尼斯·威廉姆森的回答(我已經http://www.vanheusden.com/multitail/

+ 1'ed他相應地)這裏是爲你填補的空白。

在你的shell,運行以下腳本(或它的zsh的等價,我在bash颳起此之前我看到的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 

背景,我不知道zsh的,所以它可能是不同的)...

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

然後tail -F $SYMLINK_PATH使尾部手中的符號鏈接或文件的旋轉的變化。

這有點複雜,但我不知道用尾巴做這件事的另一種方法。如果有人知道一個實用程序可以處理這個問題,那麼讓他們繼續前進,因爲我也很想親自看到它 - 默認情況下,像Jetty這樣的應用程序以這種方式記錄日誌,並且我總是編寫一個在cron上運行的symlinking腳本來補償爲了它。

[編輯:從其中一行的末尾刪除了錯誤的'j'。你也有一個不好的變量名「lastModifiedFile」根本不存在,你設置正確的名稱是「上次更改」]

+0

謝謝,我可能必須這樣做。我看着multitail,但不幸的是它只是交互式的,這意味着我無法將它輸出到別處。我會嘗試一下,看看我在哪裏。事情是,我希望這隻能在尾部運行時退出,退出時退出,而我不知道如何去做。 – Axiverse 2010-08-06 08:28:32

+0

謝謝!這基本上是我喜歡的唯一解決方案(我爲此搜索了很多)。 – 2012-07-05 05:06:26

+0

Neato。編輯修復了一個不適合我的第一次使用的bug。 (因爲getCurrentlySymlinkedFile返回一個空字符串,並且錯字不存在的lastModifiedDate也計算爲一個空字符串。) – funroll 2012-11-13 14:19:42

2

我沒有測試過這一點,但可能工作的方法是運行創建和更新一個符號鏈接到最新的日誌文件,一個後臺進程,然後你會tail -f(或tail -F)的符號鏈接。

11

我相信最簡單的解決辦法如下:

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

現在,如果你的目錄中包含像「SystemLog」等日誌文件,你只想要最新的「SoftwareLog」文件,那麼只需在包括的grep如下:

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

或使用head而不是tail,使事情變得簡單=) ls -t |頭-1 | xargs tail -F – 2012-04-20 21:46:26

+0

或者可以使用:'''tail -f SoftwareLog.'date +'%Y-%m-%d-%H''''' – 2016-08-17 21:46:22

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 

然後運行它爲:tail.sh 'SoftwareLog*'

如果將日誌寫入到檢查之間,腳本將丟失一些日誌行。但至少它是一個單獨的腳本,不需要符號鏈接。