[ZF3] zend-logをdiコンテナ経由で利用する際のpriorityの設定

zend-logを有効にすることで、diコンテナ経由でロガーのインスタンスが取得できるようになります。zend-logを有効にするには/config/modules.config.phpにZend\Logの行を追加します。

<?php
return [
    'Zend\Log', // ← Zend\Logを追加
    'Zend\Router',
    'Zend\Validator',
    'Application',
];

ドキュメント通りに実装する

公式ドキュメントでは下記の様に設定ファイルにロガーを定義すると書いてありました。

// module.config.php
return [
    'log' => [
        'MyLogger' => [
            'writers' => [
                [
                    'name' => 'stream',
                    'priority' => Logger::DEBUG,
                    'options' => [
                        'stream' => 'php://output',
                        'formatter' => [
                            'name' => 'MyFormatter',
                        ],
                        'filters' => [
                            [
                                'name' => 'MyFilter',
                            ],
                        ],
                    ],
                ],
            ],
        ],
    ],
];

引用元: Service Manager Integration – zend-log

シンプルに実装するために下記の様に定義します。

return [
    'log' => [
        'MyLogger' => [
            'writers' => [
                [
                    'name' => 'stream',
                    'priority' => \Zend\Log\Logger::DEBUG,
                    'options' => [
                        'stream' => 'php://output',
                    ],
                ],
            ],
        ],
    ],
];

ロガーを取得してログを出力するには下記のようにします。

// diコンテナからロガーの取得
$logger = $container->get('MyLogger');

// デバッグ出力
$logger->debug('debug');
echo '<br />';

// 情報出力
$logger->info('info');
echo '<br />';

出力結果です。

出来ました。

ログのpriorityを設定する

本番環境でdebugを出力しないようにするなど、環境によって出力するログのpriorityを変更するのはよくあることです。

debugを出力しないように設定ファイルに定義します。

return [
    'log' => [
        'MyLogger' => [
            'writers' => [
                [
                    'name' => 'stream',
                    'priority' => \Zend\Log\Logger::INFO,
                    'options' => [
                        'stream' => 'php://output',
                    ],
                ],
            ],
        ],
    ],
];

priorityに\Zend\Log\Logger::INFOを設定しました。コレでdebugは出てこなくなるはずです。

出てきてしまいました。

ドキュメントを信用してはいけない

設定ファイルのwritersで定義されているwriterは、最終的にはSplPriorityQueueに登録されているのですが、ドキュメントのサンプルコードに記載されている「’priority’ => \Zend\Log\Logger::DEBUG」の行は、実はSplPriorityQueueに登録される際の優先順位に使用されているだけなのです。

つまり、ログのpriorityとは意味が違うのですが、公式ドキュメントではログのpriorityの定数が使用されていますので、罠になっています。

ログのpriorityを設定するには下記のようにします。

return [
    'log' => [
        'MyLogger' => [
            'writers' => [
                [
                    'name' => 'stream',
                    'options' => [
                        'stream' => 'php://output',
                        'filters' => \Zend\Log\Logger::INFO,
                    ],
                ],
            ],
        ],
    ],
];

コレでdebugは出力されないようになります。

出来ました。

コメントを残す