2

我有一个命令行应用程序,它在运行时提供命令行输出。当我将它写入文件(例如:app >> log.txt)时,它都显示在文本文件中,就像它出现在终端中一样。我需要能够为输出加上时间戳,这样如果我让它继续运行,我就可以回来查看它何时打印。

我尝试过管道到 perl 脚本:

#!/usr/bin/env perl
use strict;
use warnings;
while (<STDIN>) {
  print time.": $. : $_";
}

使用此命令:

./app | perl timestamp.pl >> test.log 2>&1

但是日志是空的。很抱歉,我无法更具体地了解我正在运行的应用程序。

4

2 回答 2

4

受缓冲之苦?

$| = 1;

在脚本的顶部。

于 2012-07-06T15:56:30.063 回答
0

@mob 的回答很可能解决了您的直接问题。但是,我建议您考虑在模式下使用Log::Log4perleasy。它将帮助您避免多次重新发明轮子,并且您将免费获得易于配置的日志记录级别:

#!/usr/bin/env perl

use strict; use warnings;

use Log::Log4perl qw(:easy);
Log::Log4perl->easy_init($WARN);

while (<>) {
    INFO "$. : $_";
    if ( /easy/ and ($. > 1)) {
        ERROR "$ARGV [$.] - Make easy things harder!";
    }
    if (eof) {
        ALWAYS "Done with $ARGV";
    }
}
C:\temp> log.pl log.pl
2012/07/07 20:41:57 log.pl [5] - 让简单的事情变得更难!
2012/07/07 20:41:57 log.pl [6] - 让简单的事情变得更难!
2012/07/07 20:41:57 log.pl [10] - 让简单的事情变得更难!
2012/07/07 20:41:57 log.pl [11] - 让简单的事情变得更难!
2012/07/07 20:41:57 完成 log.pl

另请注意:

虽然这已被证明可以很好地让人们慢慢熟悉 Log::Logperl,有效地避免用大量不同的旋钮来摆弄他们(类别、附加器、级别、布局),但 Log 的总体使命是: :Log4perl 就是让人们从一开始就使用类别来习惯这个概念。所以,让我们把它隐藏在手册页中(恭喜你读到这里 :)。

于 2012-07-08T00:43:28.527 回答