Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中向STDERR输出添加时间信息?_Perl - Fatal编程技术网

如何在Perl中向STDERR输出添加时间信息?

如何在Perl中向STDERR输出添加时间信息?,perl,Perl,有没有一种简单的方法可以将错误标记到stderr?为了解决问题,我需要知道何时发生错误 例如: Dec 10 12:00:00 Can't call method "str" on an undefined value 谢谢 见。关于日志记录的选项比您需要的多得多,但至少这是选项之一。定义用于处理警告和致命错误的自定义处理程序: use strict; use warnings; $SIG{__WARN__} = sub { warn sprintf("[%s] ", scalar loca

有没有一种简单的方法可以将错误标记到stderr?为了解决问题,我需要知道何时发生错误

例如:

Dec 10 12:00:00 Can't call method "str" on an undefined value

谢谢

见。关于日志记录的选项比您需要的多得多,但至少这是选项之一。

定义用于处理警告和致命错误的自定义处理程序:

use strict;
use warnings;

$SIG{__WARN__} = sub { warn sprintf("[%s] ", scalar localtime), @_ };
$SIG{__DIE__}  = sub { die  sprintf("[%s] ", scalar localtime), @_ };

warn;
die;
输出:

[Fri Dec 11 14:35:37 2009] Warning: something's wrong at c:\temp\foo.pl line 7.
[Fri Dec 11 14:35:37 2009] Died at c:\temp\foo.pl line 8.

您可能希望使用
gmtime
而不是
localtime

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
信号创建一个处理程序,并在其中添加

use Date::Format;

$SIG{'__WARN__'} = sub { warn time2str( '%C ', time ), $_[0] };

....
# rest of your script here.

\uuuu警告\uuuu
处理程序只捕获警告。它们无法捕获打印标准。如果你想抓住一切,你就得打领带

#!/usr/bin/perl -w

package Tie::Handle::Timestamp;

use strict;
use warnings;

use base 'Tie::Handle';

sub stamp {
    return scalar localtime() .": ";
}

sub TIEHANDLE {
    my $class = shift;
    my $handle = shift;

    # Dup the filehandle otherwise we'll be calling ourself
    open my $fh, ">&", $handle or die $!;

    return bless $fh, $class;
}

sub PRINT {
    my $self = shift;
    print { $self } $self->stamp, @_;
}

sub PRINTF {
    my $self = shift;
    my $format = shift;
    printf { $self } $self->stamp . $format, @_;
}

sub CLOSE {
    my $self = shift;
    close $self;
}


package main;

# Tie it at compile time to catch compile time warnings
BEGIN {
    tie *STDERR, "Tie::Handle::Timestamp", *STDERR or die;
}

print STDERR "Foo\n";
warn "Bar";
undef == 2;

这有其自身的危险,因为您现在依赖于tie实现的好坏。我很惊讶还没有一个CPAN模块用于此,但我不知道我可以推荐哪一个。

谢谢您投票支持!它完全被破坏了。也许没有cpan模块,因为有足够多的人喜欢CGI::Carp(它的时间戳是warn&friends,但不是print STDERR)SWATCH BEATS!去他的太阳!这是我一直在寻找的快速而肮脏的解决方案。还必须添加$SIG{DIE}处理程序来标记一些错误。谢谢嗯…我在模具的输出中得到了两个时间戳。[2009年12月10日星期四13:23:51][2009年12月10日星期四13:23:51]诸如此类blah@macbus:您是否正在从您的
\uuuu DIE\uuu
处理程序中调用
warn
?如果是这样,不要。我已经更新了答案,加入了一个例子。@carman:不,我已经死在那里了。你的例子很有效,所以我这边有些东西不可靠。我正在使用Exception::Class和Moose,所以这可能与双时间标记有关?啊……假设(Exception::Class)抛出调用die,然后在我的代码中,我捕获它,打印消息,然后再次调用die。因此,双时间标签。