ある場所では私がうまくいった。
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つを追加すると、フルパスが提供されます。ls
tail -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*最近のログをすべて表示します。