我有一个问题,一个应用程序在DBI调用期间随机死亡。我们不能在我们的测试或验收环境中可靠地重现它,所以我需要在我们的生产系统上监控它,试图弄清楚发生了什么。
我通过DBI_TRACE环境变量记录所有DBI流量。
DBI_TRACE=3=dbi.log script.pl然而,问题是在DBI日志文件中没有时间戳,因此很难通过它们来查找在芯片发生时发生了什么。
有没有办法启用带有时间戳的DBI日志记录?
发布于 2009-08-19 04:10:14
DBI文档contains代码如何使用分层文件句柄启用带时间戳的日志。缺点是您失去了使用环境变量的特权,并且必须在代码中设置跟踪参数:
$dbh->trace('SQL', $fh);其中$fh保存对作为PerlIO::Via的“子类”的对象的引用
发布于 2009-08-19 00:58:10
您可以使用File::Tee来重定向STDERR并添加一个带有时间戳的前缀。
例如:
use strict;
use warnings;
use File::Tee 'tee';
my $logfile = "/path/to/timestamped/logfile.log";
my $filter = sub { return localtime() . ' ' . $_[0] };
my $pid = tee STDERR, { preprocess => $filter, reopen => $logfile };
print STDERR "something bad happened.";这样做的好处是它不会干扰您现有的STDERR --所有错误消息都将继续出现在同一位置。但是流是复制的,并且还被写入$logfile,通过$filter钩子进行您想要的任何转换。
发布于 2009-08-19 03:48:15
如果不能覆盖STDERR,并且您使用的是UNIXy系统(各种帖子都建议您这样做),那么您可以将跟踪输出定向到fifo,并在那里运行时间戳过滤器:
$ mkfifo /tmp/fifo
$ perl -MTime::HiRes=time -npe 's/^/time . " "/e' < /tmp/fifo > /tmp/timestamped.log &
[1] 12345
$ DBI_TRACE=1=/tmp/fifo script.pl过滤程序可以是任何东西,甚至是logger,它在我的系统上添加了由syslogd提供的时间戳。
https://stackoverflow.com/questions/1297140
复制相似问题