Как установить последний файл журнала с заданным шаблоном - PullRequest
10 голосов
/ 05 августа 2010

Я работаю с какой-то системой журналов, которая создает файл журнала каждый час, например:

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])  

, но подстановочный оператор восстанавливается до того, как он передается на хвост, и не повторяется каждый раз при повторных попытках на хвост.

Ответы [ 4 ]

12 голосов
/ 12 января 2011

Я считаю, что самое простое решение заключается в следующем:

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

Теперь, если ваш каталог содержит другие файлы журнала, такие как «SystemLog», и вам нужен только самый последний файл «SoftwareLog», тогда вы просто добавили бы grep следующим образом:

tail -f `ls -tr | grep SoftwareLog | tail -n 1`
7 голосов
/ 06 августа 2010

[Редактировать: после быстрого поиска в инструменте]

Возможно, вы захотите попробовать мультитейл - http://www.vanheusden.com/multitail/

Если вы хотите придерживаться ответа Денниса Уильямсона (и яve + 1 ему соответственно) вот пробелы, заполненные для вас.

В вашей оболочке запустите следующий скрипт (или это эквивалентно 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, чтобы компенсироватьдля него.

[Редактировать: убрал ошибочный 'j' с конца одной из строк.У вас также было неверное имя переменной «lastModifiedFile», не существовало, правильное имя, которое вы указали, - «lastModified»]

3 голосов
/ 06 августа 2010

Я не проверял это, но подход, который может работать, состоял бы в том, чтобы запустить фоновый процесс, который создает и обновляет символическую ссылку на последний файл журнала, а затем вы * tail -f (или tail -F) символьная ссылка.

1 голос
/ 26 сентября 2014
#!/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*'

Скрипт потеряет некоторые строки журнала, если журналы записываются между проверками. Но, по крайней мере, это один скрипт, без символических ссылок.

...