使用Zend Framework为每个日志调用动态设置自定义事件项

时间:2010-07-09 21:20:33

标签: php zend-framework logging

我们正在使用Zend_Log类来更新一些不同的“看门狗”数据库表(记录不同的事件:运行批处理脚本,处理新数据,生成文件等)。

这是我目前的代码(在我正在研究修复之前。)

$writer = new Zend_Log_Writer_Db($db, 'watchdog', array(
    'priority'  => 'priority',
    'message'   => 'message',
    'owner'     => 'owner',
));

$logger = new Zend_Log($writer);
$logger->setEventItem('owner', 'MODULE_NAME');

这完全没问题。但是,我想添加一个名为datetime的数据库列,该列是在事件发生时调用time()。所以,从理论上讲,它会是这样的:

$writer = new Zend_Log_Writer_Db($db, 'watchdog', array(
    'priority'  => 'priority',
    'message'   => 'message',
    'owner'     => 'owner',
    'datetime'  => 'datetime',
));

$logger = new Zend_Log($writer);
$logger->setEventItem('owner', 'MODULE_NAME');
$logger->setEventItem('datetime', time());

我遇到的问题是,显然,调用time()会在第一次调用Zend_Log::setEventItem时调用,而不是在调用Zend_Log::info()时调用。所以,问题是,当time()被调用时,如何调用Zend_Log::info()并将其存储在我的数据库中?我是否需要使用更多自定义类扩展Zend_Log_Writer_Db

2 个答案:

答案 0 :(得分:2)

我想要提出的另一个解决方案是将Zend_Db_Expr与NOW()或TIMESTAMP()等MySQL函数一起使用。

$dblog->setEventItem('datetime', new Zend_Db_Expr('NOW()'));

答案 1 :(得分:1)

扩展似乎是最好的主意。

我会使用默认列created_atupdated_at创建一个时间戳事件,并在每次日志写入时自动更改。

(这是Timestampable behaviour from Doctrine

My_Log_Writer_Db_Timebstampable extends Zend_Log_Writer_Db