Zend framework2 是否有方法将日志编写器工厂添加到记录器配置中?

Zend framework2 是否有方法将日志编写器工厂添加到记录器配置中?,zend-framework2,Zend Framework2,我编写logger config并使用Zend\Log\LoggerServiceFactory配置logger。如果我使用基本作者,所有的工作。但我想把我自己的作者加入一个由工厂创建的记录器,这是donn't work 是否有一种方法可以使用config和base logger factory从自己的工厂添加writer 更新:这是我的代码 这是我的配置,我为记录器定义工厂,为编写器定义工厂,为基本编写器定义配置 // config/autoload/global.php return ar

我编写logger config并使用Zend\Log\LoggerServiceFactory配置logger。如果我使用基本作者,所有的工作。但我想把我自己的作者加入一个由工厂创建的记录器,这是donn't work

是否有一种方法可以使用config和base logger factory从自己的工厂添加writer

更新:这是我的代码

这是我的配置,我为记录器定义工厂,为编写器定义工厂,为基本编写器定义配置

// 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模块的工厂

如果没有Rollbar writer,此配置将执行我需要的操作—创建和配置standart writer

因此,我从aontroller调用记录器:

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

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

我想我找到了解决办法。这个解决方案不是很好,但没有比这更好的了,我想出来了

我编写了一个标准factory\Zend\Log\LoggerServiceFactory的替换,并从我的工厂中的记录器构造函数传输记录器配置。此外,我还为writer工厂添加了一张支票

下面是生成的类:

<?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;
    }
}

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

也许你可以给我们看一些代码来帮助你,我为延误道歉。添加代码示例