【问题标题】:How can I monitor a log file and insert timestamps, using Perl?如何使用 Perl 监视日志文件并插入时间戳?
【发布时间】:2010-10-20 09:41:45
【问题描述】:

我有一个以附加模式生成日志的应用程序,但日志没有时间戳。

是否可以使用带有某些选项的tail -fperl 脚本来监控对该文件的写入并在它们前面加上时间戳?

鉴于我在没有 Cygwin 的情况下运行 Windows,我是否可以避免使用 bash 或任何其他 Unix shell?

【问题讨论】:

    标签: perl tail gnuwin32


    【解决方案1】:

    如果您使用的是 GNU tail,那么您应该可以使用 GNU gawk

    C:\test>tail -F file  | gawk.exe "{s=systime(); print strftime(\"%Y-%m-%d:%H:%M:%S\",s),$0}"
    

    【讨论】:

    • 太棒了!我已经拥有来自 UnxUtils 的所有二进制文件,还没有想到 gawk……谢谢!
    • gnuwin32.sourceforge.net/packages.html 下载 GNU 工具。 UnxUtils 的那些已经过时了
    • 我用它来更新带有时间戳的 telnet 日志,但是 gawk 没有附加时间戳。 C:\tail.exe -F "C:\Test.txt" | C:\gawk.exe "{s=systime(); print strftime(\"%Y-%m-%d:%H:%M:%S\",s),$0}"
    【解决方案2】:

    你可以使用while循环:

    tail -f logfile | while read line;
    do
        echo $(date) $line;
    done
    

    暗示每行的运行日期。您可以使用 date 命令的格式输出选项来获取您想要的时间戳格式。

    我非常基本的 Perl 等价物是 (script.pl):

    while (<>) {
        my $date = scalar localtime;
        print $date . " " . $_;
    }
    
    tail -f logfile | perl script.pl
    

    【讨论】:

    • 哈哈。我忘了告诉我我使用的是 Windows,并且我想避免安装 Cygwin :) 不过还是谢谢!
    • @Benoit - 不用担心 - 也许重新标记?有人会随时支持 Perl 版本。
    • perl 脚本也很好……我希望我能接受多个答案。
    • 为了避免echo 带有反引号,您可以将$line 作为参数传递给datedate +"%c $line"(前提是您的$line 不包含@987654328 的百分比代码@ 将解释为格式化指令)。
    【解决方案3】:

    您可以使用带有 File::Tail 和 DateTime 的 perl 脚本吗?

    use File::Tail;
    use DateTime;
    my $ref=tie *FH,"File::Tail",(name=>$ARGV[0]);
    while (<FH>) {
        my $dt = DateTime->now();
        print "[", $dt->dmy(), " ",$dt->hms(),"] $_";
    }
    

    【讨论】:

      【解决方案4】:

      看起来File::Tail 模块是专门为读取附加日志文件而设计的。

      可能值得一看。

      【讨论】:

        猜你喜欢
        • 2019-03-14
        • 1970-01-01
        • 1970-01-01
        • 2019-05-28
        • 1970-01-01
        • 2015-06-03
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        相关资源
        最近更新 更多