tail -f 最近のログファイル

tail -f 最近のログファイル

ある場所では私がうまくいった。

ls -rt /path/to/log/file/ | tail -1 | xargs tail -f

しかし、なぜ常に機能しないのか理解できません。
(ここでログローリングを修正するまで、これはクイック修正です。)

答え1

ソートコマンドとTHE最近のログファイル

-r出力端到達を使用する代わりに(逆ソート順)を使用するのはなぜですかtail

一般的なソート順序を使用して最初のアイテムを取得する方が高速です!

tail -f `/bin/ls -1td /path/to/log/file/*| /usr/bin/head -n1`

または

tail -f $(/bin/ls -1t /path/to/log/file/* | /bin/sed q)

うまくいきます。

sed注:このコマンドはにあるので、インストールする/bin前に使用することをお勧めします/usr

tail -f `/bin/ls -1tr /path/to/log/file/* | /bin/sed -ne '$p'`

これはうまくいきますが、すでに述べたように、最後の項目だけを使用するために出力全体を削除するのではなく、ソート順を逆にすると機能しません。本当に良い考えです。;-)

警告する、最後のディレクトリのディレクトリ*と一致しないでください。そうしないと、コマンドがtailそのディレクトリを開く方法がわかりません。

同じですが、find最新のファイルを検索する場合:

read -a file < <(
    find /tmp 2>/dev/null -type f -mmin +-1 -mmin -10 -printf "%Ts %p\n" |
    sort -rn)
tail -f ${file[1]}

メモ:

  • -mmin +-1間違ったタイミングファイルがリストされていないことを確認してください。未来に
  • read組み込みで、配列を作成して使用をブロックします。head -n1| cut -d \ -f2
  • -mmin -10これを変更または抑制できますが、これによりソートプロセスが長くなるのを防ぎます。

ただし、tailは複数のファイルビューをサポートしています。

2つのシェルコンソールを開き、次のことを試してください。

最初のコンソールで:

user@host[pts/1]:~$ touch /tmp/file_{1,2,3}
user@host[pts/1]:~$ tail -f /tmp/file_{1,2,3}
==> /tmp/file_1 <==

==> /tmp/file_2 <==

==> /tmp/file_3 <==

2番目は、最初のコンソールが表示された状態で複数回クリックします。

user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM
25285
user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM
16381
user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM
19766
user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM
3053

最初のコンソールは次のとおりです。

==> /tmp/file_2 <==
25285

==> /tmp/file_1 <==
16381
19766

==> /tmp/file_3 <==
3053

...

SO質問のアイデアですが、時間ベースのマルチファイル

find次のコマンドを使用すると、-mmin過去数分または数日間に変更されたファイルを監視できます-mtime

find /path/to/logdir -type f -mmin -10 -exec tail -f {} +

過去10分間の修正を監視するために使用されるログファイル。

メモ:

  • 見てman tail、薬
    • -F長時間視聴オプション
    • -qファイル名を印刷しないオプション

素晴らしいフォーマット

find /path/to/logdir -type f -mmin -10 -exec tail -f {} + |
    sed -une 's/^==> .path.to.logdir.\(.*\) <==$/\1             /;ta;bb;
               :a;s/^\(.\{12\}\) *$/\1: /;h;bc;
               :b;G;s/^\(..*\)\n\(.*\)/\2 \1/p;:c;'

そこでより適切な長さに変更して.path.to.logdir.変更できます。12

たとえば、2つのコンソールを保持し、最初のコンソールは停止して試みます。

user@host[pts/1]:~$ find /tmp/ -type f -mtime -1 -name 'file_?' -exec tail -f {} + |
    sed -une 's/^==> .tmp.\(.*\) <==$/\1             /;ta;bb;
        :a;s/^\(.\{12\}\) *$/\1: /;h;bc;
        :b;G;s/^\(..*\)\n\(.*\)/\2 \1/p;:c;'
file_2      :  25285
file_1      :  16381
file_1      :  19766
file_3      :  3053

2番目のコンソールよりももう一度クリックしてください。

user@host[pts/2]:~$ tee -a /tmp/file_$((RANDOM%3+1)) <<<$RANDOM

答え2

これはファイル名のみを提供し、ファイルが見つから/path/to/log/fileないため、存在しないと機能しません。最後に1つを追加すると、フルパスが提供されます。lstail -f*ls

ls -rt /var/log/apache2/* | tail -1 | xargs tail -f

答え3

最も簡単な解決策は、zshを使用して利用することです。グローバル予選 om変更時間に基づいて並べ替え(最も最近のものから)、[1]最初の一致のみを保持します。

tail -f /path/to/log/directory/*(om[1])

zshがない場合はzshをインストールしてください。 zshを本当にインストールしたくない場合は、使用するのも悪くありませんls。ファイル名に特殊文字が含まれていない限り、ログファイルは問題ありません(印刷できない文字は問題を引き起こす可能性があります)。気づくPaylo Almeidaがすでに言ったようにls /path/to/log/directoryへの相対パスを表示するため、出力は使用できません/path/to/log/directory。まず、このディレクトリに変更できます。

cd /path/to/log/directory
tail -f "$(ls -t | head -n 1)"

または、次のパスを追加できます。

tail -f "/path/to/log/directory/$(ls -t /path/to/log/directory | head -n 1)"

または、lsフルパスを印刷できます。

tail -f "$(ls -t /path/to/log/directory/* | head -n 1)"

このtailコマンドは、後で新しいログファイルが生成されても同じファイルを永久に追跡します。自動的に別のファイルに切り替えるには、新しいファイルを検出してtail新しいファイルから新しいインスタンスを起動するより洗練されたアプローチが必要です。 Linuxでは、次のものを使用できます。inotify相互作用。

while true; do
  tail -n +1 -f /path/to/log/directory/*(om[1])
  inotifywait -qq -e create /path/to/log/directory
  kill $!
done

答え4

イベントログディレクトリに移動して、次の情報を提供します。尾 -f*最近のログをすべて表示します。

関連情報