【问题标题】:Database logging in Zend Framework 2: wrong "extra" column nameZend Framework 2 中的数据库日志记录:错误的“额外”列名
【发布时间】:2013-01-24 02:45:44
【问题描述】:

我想从 Zend Framework 2 将日志条目保存到我的 MySQL 数据库。我正在使用 Zend\Log\LoggerZend\Log\Writer\Db 编写器。通过向 writer 提供一个数组,可以选择将哪些数据保存到哪些列(例如,将时间戳记到“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 参数是一个数组,其中包含与我的第一个代码 sn-p 中的 $mapping 数组相同的键以及日志消息的值。 $columnMap 参数是我的第一个代码 sn-p 中的 $mapping 数组(数组值是列名)。

实际上似乎发生的是,因为我将额外信息作为数组传递(这是必需的),所以执行了内部 foreach 循环。在这里,$key 是 0(索引),所以它实际上是这样的:$columnMap['extra'][0]。这给出了字母“e”(“extra_column”中的第一个字母),用作列名,它应该是整个列名。

我尝试在调用 log 方法时在额外数组中提供我自己的键,但同样的情况发生了。官方文档没有显示额外参数的使用示例。我想在我的表中插入可以帮助我调试错误的信息,所以我想使用它。

这是一个错误还是我错过了什么?这对我来说真的很奇怪!我希望我解释得足够好 - 这很棘手!

【问题讨论】:

  • 在我看来,它要求您将额外信息指定为名称值映射,例如['somethingElseIWantToKnow' => 'Suns shining']。因此,您必须将映射设置为['timestamp' => ..., 'extra' => ['somethingElseIWantToKnow' => 'whats_the_weather']]。但是,我还没有使用 DB writer,我只能通过查看来源来猜测。
  • @DanielM 谢谢!原来是这个问题。我应该知道的,但它帮助得到了另一双眼睛。 :-) 如果您将评论复制到答案中,我会接受。再次感谢。

标签: php logging zend-framework2


【解决方案1】:

由于 Daniel M 尚未发布他的评论作为答案,我将向您推荐他解决问题的评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多