11

次のように、1時間ごとにログファイルを作成するログシステムを使用しています。

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

パターン (SoftwareLog* など) を示す最新のログ ファイルを追跡しようとしていますが、次のようなものがあることに気付きました。

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

しかし、それは 1 つの特定の名前に従うだけであり、これらは日付と時間によって異なる名前を持っています。私は次のようなものを試しました:

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

ただし、ワイルドカードステートメントは、テールに渡される前に解決され、テールの再試行のたびに再実行されるわけではありません。

助言がありますか?

4

6 に答える 6

13

最も簡単な解決策は次のとおりだと思います。

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

ディレクトリに「SystemLog」などの他のログ ファイルが含まれていて、最新の「SoftwareLog」ファイルのみが必要な場合は、次のように grep を含めるだけです。

tail -f `ls -tr | grep SoftwareLog | tail -n 1`
于 2011-01-12T16:14:17.687 に答える
7

[編集:ツールをすばやくグーグル検索した後]

multitail を試してみてください - http://www.vanheusden.com/multitail/

Dennis Williamson の回答に固執したい場合 (それに応じて彼に +1 を付けました)、ここに空白が埋められています。

シェルで、次のスクリプトを実行します (または、これは zsh に相当します。zsh タグが表示される前に、これを bash で作成しました)。

#!/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で実行されるシンボリックリンクスクリプトをスクリプト化して補償します.それのための。

[編集: 1 つの行の終わりから誤った 'j' を削除しました。また、「lastModifiedFile」という変数名が存在しませんでした。設定した適切な名前は「lastModified」です]

于 2010-08-06T02:04:16.880 に答える
3

私はこれをテストしていませんが、最新のログ ファイルへのシンボリック リンクを作成および更新するバックグラウンド プロセスを実行してから、シンボリック リンクを作成するtail -f(またはtail -F) というアプローチが有効な場合があります。

于 2010-08-06T01:26:58.447 に答える
1
#!/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*'

ログがチェックの間に書き込まれると、スクリプトはいくつかのログ行を失います。しかし、少なくともシンボリック リンクを必要としない単一のスクリプトです。

于 2014-09-25T22:11:00.853 に答える
0

最も簡単な方法は、 lsheadでtailを使用することだと思います。このようなことを試してください

tail -f `ls -t SoftwareLog* | head -1`
于 2022-01-05T07:29:05.977 に答える
0

次のような日次ローテーション ログ ファイルがあります/var/log/grails/customer-2020-01-03.log。最新のものまでtail、次のコマンドはうまくいきました:

tail -f /var/log/grails/customer-`date +'%Y-%m-%d'`.log

(注:+式の符号の後にスペースを入れないでください)

したがって、次のように動作するはずです (ログの同じディレクトリにいる場合)。

tail -f SoftwareLog.`date +'%Y-%m-%d-%H'`
于 2020-01-03T05:58:39.380 に答える