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'));
私が直面している問題は、列名とその値の配列に、「余分な」列の列名が正しくないことです。上記の配列に基づいて、値「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 メソッドを呼び出すときに、余分な配列に独自のキーを指定しようとしましたが、同じことが起こります。公式ドキュメントには、余分なパラメーターの使用例は示されていません。エラーのデバッグに役立つ情報をテーブルに挿入したいので、使用したいと思います。
これはバグですか、それとも何か不足していますか? 私には本当に奇妙に思えます!私はそれを十分に説明したと思います - それはかなりトリッキーです!