我想从Zend Framework 2将日志条目保存到我的MySQL数据库。我正在使用Zend\Log\Logger
和Zend\Log\Writer\Db
编写器。通过向编写器提供数组,可以选择将哪些数据保存到哪些列(例如,时间戳到“log_date”列中)以及要保存哪些数据。这就是我在做的事情:
$logger = new Zend\Log\Logger();
$mapping = array(
'timestamp' => 'timestamp_column',
'priority' => 'priority_column',
'message' => 'message_column',
'extra' => 'extra_column'
);
$logger->addWriter(new Zend\Log\Writer\Db($dbAdapter, 'table_name', $mapping));
$logger->err('some message', array('some extra information'));
我面临的问题是列名称及其值的数组包含“额外”列的错误列名。基于上面的数组,它应该将值“一些额外信息”插入“extra_column”列。问题是Zend\Log\Writer\Db
类使用字母“e”作为额外列的名称。这来自我上面数组中“extra_column”的第一个字母。出于某种原因,它采用“extra_column”的第一个字母并将其用作列名而不是整个值。
我看了一下源代码。 mapEventIntoColumn
方法用于将列名和值作为数组获取。我复制了以下方法的相关部分。
// Example:
// $event = array('extra' => array(0 => 'some extra information'));
// $columnMap = array('extra' => 'extra_column');
// Return: array('e' => 'some extra information')
// Expected (without looking at the code below): array('extra_column' => 'some extra information')
protected function mapEventIntoColumn(array $event, array $columnMap = null) {
$data = array();
foreach ($event as $name => $value) {
if (is_array($value)) {
foreach ($value as $key => $subvalue) {
if (isset($columnMap[$name][$key])) {
$data[$columnMap[$name][$key]] = $subvalue;
}
}
}
}
return $data;
}
$event
参数是一个数组,其中包含与我的第一个代码段中的$mapping
数组相同的键以及日志消息的值。 $columnMap
参数是我的第一个代码段中的$mapping
数组(数组值是列名)。
实际上似乎发生的是因为我将额外信息作为数组传递(这是必需的),所以执行内部foreach循环。这里,$key
为0(索引),所以它实际上是这样的:$columnMap['extra'][0]
。这给出了字母“e”(“extra_column”中的第一个字母),用作列名,而它应该是整个列名。
我在调用log方法时尝试在额外数组中提供自己的密钥,但同样的情况也是如此。官方文档没有显示额外参数的使用示例。我想插入可以帮助我调试错误的信息到我的表中,所以我想使用它。
这是一个错误还是我错过了什么?这对我来说真的很奇怪!我希望我解释得很好 - 这很棘手!
答案 0 :(得分:2)
由于Daniel M尚未发表评论作为答案,我将向您推荐他解决问题的评论。