【问题标题】:Zend_Log with multiple writers in application.iniZend_Log 与 application.ini 中的多个编写器
【发布时间】:2011-09-07 14:20:52
【问题描述】:

我的配置中有一个记录器,如下所示:

resources.log.stream.writerName = "Stream"
resources.log.stream.writerParams.stream = APPLICATION_PATH "/../logs/err.log"
resources.log.stream.writerParams.mode = "a"
resources.log.stream.filterName = "Priority"
resources.log.stream.filterParams.priority = 3

但我只想将它用于错误日志。对于另一个日志想要使用另一个日志文件。出于这个原因,我将这些行添加到 app.ini

resources.log.stream.writerName = "Stream"
resources.log.stream.writerParams.stream[] = APPLICATION_PATH "/../logs/debug.log"
resources.log.stream.writerParams.stream[] = APPLICATION_PATH "/../logs/info.log"
resources.log.stream.writerParams.mode = "a"
resources.log.stream.filterName = "Priority"
resources.log.stream.filterParams.priority[] = 7
resources.log.stream.filterParams.priority[] = 5

但这不起作用我想为不同的优先级使用不同的文件。但是记录器会覆盖第一个记录器。怎么样?

【问题讨论】:

    标签: zend-framework logging zend-log


    【解决方案1】:

    application.ini 示例:

    resources.log.err.writerName = "Stream"
    resources.log.err.writerParams.stream =  APPLICATION_PATH "/../data/logs/ERR.log"
    ;resources.log.stream.formatterParams.format = "%priority%:%message% %timestamp% %priorityName%  %info% PHP_EOL"
    resources.log.err.filterName = "Priority"
    resources.log.err.filterParams.priority = 3
    resources.log.err.filterParams.operator = "=="
    
    resources.log.warn.writerName = "Stream"
    resources.log.warn.writerParams.stream = APPLICATION_PATH "/../data/logs/WARN.log"
    ;resources.log.warn.formatterParams.format = "%priority%:%message%:%ip%:%userid% %timestamp% %priorityName%  %info% PHP_EOL"
    resources.log.warn.filterName = "Priority"
    resources.log.warn.filterParams.priority = 4
    resources.log.warn.filterParams.operator = "=="
    

    在引导程序中:

    protected function _initLog() {
        $options = $this->getOption('resources');
        $partitionConfig = $this->getOption('log');
        $logOptions = $options['log'];
        $logger = Zend_Log::factory($logOptions);
        $logger->addPriority('USERACTION', 8);
        $logger->addPriority('DBLOG', 9);
        Zend_Registry::set('logger', $logger);
    }
    

    然后在代码中:

    $this->logger = Zend_Registry::get('logger');
    $this->logger->setEventItem('ip', $_SERVER['REMOTE_ADDR']);
    $this->logger->setEventItem('userid', $this->userId);
    

    这样使用:

    $this->logger->log('Test error', Zend_Log::WARN);
    

    或者这样:

    $this->logger->warn('Test error');
    

    或者这样:

    $this->logger->log('Test error', 4);
    

    【讨论】:

    • 请注意,application.ini 中的常量 PHP_EOL 必须出现在引号之外。否则它将被解释为文字。
    【解决方案2】:

    您可以使用过滤器来完成此操作。只需让更高优先级的事件通过过滤器,直到您想要记录它们。

    http://framework.zend.com/manual/en/zend.log.filters.html

    您的设置有什么问题是您尝试使用不应该使用的相同编写器。使用过滤器选择写入者并将某些日志文件与某些写入者相关联,如示例的第二部分所示。

    我认为这样的事情应该可以解决问题:

    resources.log.stream.writerName = "myDebugWriter"
    resources.log.stream.writerParams.stream = APPLICATION_PATH "/../logs/debug.log"
    resources.log.stream.filterName = "Priority"
    resources.log.stream.filterParams.priority = Zend_Log::WARN
    resources.log.stream.writerName = "myInfoWriter"
    resources.log.stream.writerParams.stream = APPLICATION_PATH "/../logs/info.log"
    resources.log.stream.filterName = "Priority"
    resources.log.stream.filterParams.priority = Zend_Log::INFO
    

    【讨论】:

    • 好的,我知道 writerName 必须是 Stream 或 Firebug 等。但我无法解决针对不同错误级别的不同文件的问题。在 Bootstrap 我可以做到这一点,但我想在 app.ini 文件中做到这一点。
    • 上面的代码不起作用我试过了,问题是 ZF 中指定的 writerName 参数,如 Stream 或 Firebug。所以“MyDebugWriter”不起作用。我必须在我的项目中使用“Stream”,因为它支持错误日志或调试日志,但我找不到任何地方如何在 app.ini 中使用不同的文件
    猜你喜欢
    • 2010-12-30
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多