首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取Perl DBI日志文件中的时间戳?

如何获取Perl DBI日志文件中的时间戳?
EN

Stack Overflow用户
提问于 2009-08-18 23:34:27
回答 6查看 1.3K关注 0票数 4

我有一个问题,一个应用程序在DBI调用期间随机死亡。我们不能在我们的测试或验收环境中可靠地重现它,所以我需要在我们的生产系统上监控它,试图弄清楚发生了什么。

我通过DBI_TRACE环境变量记录所有DBI流量。

代码语言:javascript
复制
DBI_TRACE=3=dbi.log script.pl

然而,问题是在DBI日志文件中没有时间戳,因此很难通过它们来查找在芯片发生时发生了什么。

有没有办法启用带有时间戳的DBI日志记录?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-08-19 04:10:14

DBI文档contains代码如何使用分层文件句柄启用带时间戳的日志。缺点是您失去了使用环境变量的特权,并且必须在代码中设置跟踪参数:

代码语言:javascript
复制
$dbh->trace('SQL', $fh);

其中$fh保存对作为PerlIO::Via的“子类”的对象的引用

票数 2
EN

Stack Overflow用户

发布于 2009-08-19 00:58:10

您可以使用File::Tee来重定向STDERR并添加一个带有时间戳的前缀。

例如:

代码语言:javascript
复制
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钩子进行您想要的任何转换。

票数 3
EN

Stack Overflow用户

发布于 2009-08-19 03:48:15

如果不能覆盖STDERR,并且您使用的是UNIXy系统(各种帖子都建议您这样做),那么您可以将跟踪输出定向到fifo,并在那里运行时间戳过滤器:

代码语言:javascript
复制
$ 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提供的时间戳。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1297140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档