目前我正在使用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 );
}
会产生一行,每秒自动刷新一次,包含所有看到的守护进程的名字以及每个名字的计数器:
smtp:6, pop3d-ssl:13, local:6, imapd:8, smtpd:30, CRON:5, pickup:1, named:1
答案2
正如 F. Hauri 所建议的,您可以使用 perl 来格式化输出。
为了方便使用,我在我的应用程序中为 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 做很多事情,因此你可以根据需要“开发”你自己的日志阅读器。