有没有办法将日志编写器工厂添加到记录器配置中?

时间:2013-05-07 08:50:20

标签: zend-framework2

我编写了logger config并使用Zend \ Log \ LoggerServiceFactory来配置Logger。如果我使用基础编写器都可以工作。但是我想添加一个记录器,我自己的作者是由工厂创建的,这不是工作。

有没有办法使用config和base logger factory从自己的工厂添加编写器?

更新:这是我的代码

这是我的配置,我为Logger定义工厂,为编写器定义工厂,为基础编写器定义配置

// config/autoload/global.php

return array(
    'service_manager' => array(
        'factories' => array(
            'Logger'  => 'Zend\Log\LoggerServiceFactory',
            'Rollbar' => 'Yassa\Rollbar\Log\Writer\Rollbar'
        ),
    ),
    'log' => array(
        'writers' => array(
            array(
                'name' => 'stream',
                'options' => array(
                    ...
                ),
            ),
            array(
                'name' => 'stream',
                'options' => array(
                    ...
                ),
            ),
           array(
               'name' => 'Rollbar',
           ),
        ),
    ),
);

Yassa\Rollbar\Log\Writer\Rollbar - 它是来自yassa \ rollbar模块的工厂(github

如果没有Rollbar writer,这个配置可以满足我的需求 - 创建和配置标准编写器。

因此我从aontroller调用logger:

$this->getServiceLocator()->get('Logger')->info('test');

2 个答案:

答案 0 :(得分:0)

我研究了组件代码,但没有找到使用工厂创建自己的编写器的方法。不幸的是,目前这是不可能的。

答案 1 :(得分:0)

我想我找到了解决方案。解决方案不是很好,但没想到更好。我想出来了。

我为标准工厂(\Zend\Log\LoggerServiceFactory)写了一个替代品,并从我工厂的Logger构造函数中传输记录器配置。另外,我添加了对作家工厂的检查。

以下是结果类:

<?php
namespace Application\Factory;

use Zend\Log\Exception\InvalidArgumentException;
use Zend\Log\Logger;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class LoggerServiceFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        // Configure the logger
        $config = $serviceLocator->get('Config');
        $options = isset($config['log']) ? $config['log'] : array();
        $logger = new Logger();
        if (is_array($options)) {
            if (isset($options['writers']) && is_array($options['writers'])) {
                foreach ($options['writers'] as $writer) {

                    if (!isset($writer['name'])) {
                        throw new InvalidArgumentException('Options must contain a name for the writer');
                    }

                    $priority      = (isset($writer['priority'])) ? $writer['priority'] : null;
                    $writerOptions = (isset($writer['options'])) ? $writer['options'] : null;

                    if ($serviceLocator->has($writer['name'])) {
                        $writer = $serviceLocator->get($writer['name']);
                        $logger->addWriter($writer, $priority, $writerOptions);
                    } else {
                        $logger->addWriter($writer['name'], $priority, $writerOptions);
                    }
                }
            }

            if (isset($options['exceptionhandler']) && $options['exceptionhandler'] === true) {
                Logger::registerExceptionHandler($logger);
            }

            if (isset($options['errorhandler']) && $options['errorhandler'] === true) {
                Logger::registerErrorHandler($logger);
            }

        }
        return $logger;
    }
}

有人能提出更好的解决方案吗?