高效的日志查看环境

高效的日志查看环境

目前我正在使用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'
}
  1. -p:将脚本包装在循环内并输出处理后的行
  2. -e 's/(.*WARN.*)/\033[31;43;1m$1\033[0m\007/g;'为包含“WARN”的每一行添加颜色
    • \033[开始转义序列(启用格式化)
    • 31表示红色前景
    • 43表示黄色背景
    • 1启用粗体字符
    • m关闭转义序列
    • $1包括输入行
    • \033[0m是输出该行之后将默认格式恢复为标准的第二个序列
    • \007哔哔声
  3. -e 's/(.*ERROR.*)/\033[33;41;1m$1\033[0m\007/g;'为包含“ERROR”的每一行添加颜色;唯一的区别在于颜色:
    • 31表示黄色前景
    • 43表示红色背景

就我而言,我打开了可视铃声,因此我的屏幕会在出现错误时闪烁(并且我的扬声器不会发出哔哔声),并且可以非常快速地检测到错误/警告线。

您可以获取有关以下内容的更多信息:

再次,正如 F. Hauri 在他的回答中所解释的那样,你可以用 perl 做很多事情,因此你可以根据需要“开发”你自己的日志阅读器。

相关内容