目前我正在使用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
in grep
,像-u
in一樣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 );
}
會產生一行,每秒自動刷新,包含所有看到的守護程式的名字和每個人的計數器:
smtp:6, pop3d-ssl:13, local:6, imapd:8, smtpd:30, CRON:5, pickup:1, named:1
答案2
正如 F. Hauri 所建議的那樣,您可以使用 perl 來格式化輸出。
為了我的使用,我在 my 中為 tail 建立了一個別名~/.bashrc
來讀取 Glassfish 的日誌。它非常簡單(一行),並對我的輸出進行著色以強調錯誤/警告行:
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
是在輸出行後將預設格式還原為標準的第二個序列\007
嘟嘟聲
-e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;'
為包含“ERROR”的每一行著色;唯一的區別在於顏色:31
表示黃色前景43
表示紅色背景
就我而言,我打開了可視鈴,因此我的螢幕在出現錯誤時閃爍(並且我的揚聲器不會發出蜂鳴聲),並且可以非常快速地檢測到錯誤/警告線。
您可以獲得以下方面的更多資訊:
同樣,正如 F. Hauri 在他的回答中解釋的那樣,借助 Perl,您可以做很多事情,因此您可以根據需要「開發」自己的日誌閱讀器。