現在はログの表示に使用していますtail -f
。
ログを表示するより効率的/読みやすい/優れた方法はありますか?
答え1
はい!perl
賛成です実用的な抽出と研究言語。
shell
次のような構文を使用する代わりに、
tail -f file | grep --line-buffered someting
または
tail -f file | sed -une '/someting/{s/^.*:/doing some formatting/;p}'
(注:--line-buffered
ではgrep
、-u
のように、 はsed
、固定サイズのブロックによるバッファリング)
ログの表示/閲覧にperl
はの言語。
に応じて何を待っているのか...ニーズに正確に一致するように小さなスクリプトを作成する必要があるかもしれません。
perlfaq で、 のような使用可能なサンプルが見つかるかもしれませんperldoc perlfaq5
(または をman perlfaq5
インストールしていない場合はperldoc
、次の質問があります)。Perl で「tail -f」を実行するにはどうすればいいですか?私がこれを撮った場所:
初挑戦
seek(GWFILE, 0, 1);
このステートメントは
seek(GWFILE, 0, 1)
現在の位置を変更しませんが、ハンドルのファイル終了条件をクリアし、次のステートメントで<GWFILE>
Perl が再度何かを読み取ろうとするようにします。それが機能しない場合は (stdio 実装の機能に依存します)、次のようなものが必要になります。
for (;;) { for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) { # search for some stuff and put it into files } # sleep for a while seek(GWFILE, $curpos, 0); # seek to where we had been }
私はすでにこれを特別なケースをトリガーするために何度も使用しました。
デモ
例として、quick and dirty
リアルタイムログカウンター試してみてください! (読み取りアクセスが必要です/var/log/syslog
;-) :
#!/usr/bin/perl -w
my %counter;
open FH, "</var/log/syslog" or die;
my $curpos = ( stat FH )[7];
seek( FH, $curpos, 0 );
for ( ; ; ) {
for ( $curpos = tell(FH) ; <FH> ; $curpos = tell(FH) ) {
$counter{$3}++ if /^(\S+\s+){4}(\S+\/|)([^\/\[:]*)[\[:]/;
}
syswrite STDOUT, sprintf "\r%s\e[K",
join( ", ", map { sprintf "%s:%s", $_, $counter{$_} } keys %counter );
select undef,undef,undef,1;
seek( FH, $curpos, 0 );
}
1行生成され、1秒ごとに自動更新され、すべての情報が含まれる。デーモンの名前と、それぞれに対するカウンター:
smtp:6, pop3d-ssl:13, local:6, imapd:8, smtpd:30, CRON:5, pickup:1, named:1
答え2
F. Hauri が示唆しているように、出力をフォーマットするには perl を使用できます。
私の使用法では、Glassfish のログを読むために tail のエイリアスを作成しました~/.bashrc
。これは非常にシンプルで (1 行)、出力を色分けしてエラー/警告行に下線を付けます。
tail-color() {
tail $* | perl -p -e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;' -e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;' -e 's/(.*SEVERE.*)/\033[33;41;1m$1\033[0m\007/g'
}
-p
: スクリプトをループで囲み、処理された行を出力します-e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;'
「WARN」を含むすべての行を色付けします\033[
エスケープシーケンスを開始します(書式設定を有効にします)31
赤い前景を意味する43
黄色の背景を意味する1
太字を有効にするm
エスケープシーケンスを閉じる$1
入力行を含む\033[0m
行が出力された後、デフォルトのフォーマットを標準に戻す2番目のシーケンスです。\007
ビープ音
-e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;'
「ERROR」を含むすべての行を色付けします。違いは色に関するものだけです。31
黄色の前景を意味する43
赤い背景を意味する
私の場合、ビジュアルベルをオンに切り替えたので、エラーが発生すると画面が点滅し(スピーカーはビープ音を鳴らしません)、エラー/警告行を非常に迅速に検出できます。
以下の詳細情報を入手できます。
繰り返しになりますが、F. Hauri が回答で説明しているように、perl を使用すると多くのことを実現できるため、必要に応じて独自のログ リーダーを「開発」できます。