【问题标题】:Can't get Logger service in ZF2在 ZF2 中无法获取 Logger 服务
【发布时间】:2014-03-28 17:27:34
【问题描述】:

我为这个问题苦苦挣扎了几天,但仍然没有找到问题所在。

这是我在 application.config.php 中的配置段:

// Initial configuration with which to seed the ServiceManager.
// Should be compatible with Zend\ServiceManager\Config.
'service_manager' => array(
    'abstract_factories' => array(
        'Zend\Log\LoggerAbstractServiceFactory',
        'Zend\Cache\Service\StorageCacheAbstractServiceFactory',
    )
),

'log' => array(
    'Log\App' => array(
        'writers' => array(
            array(
                'name' => 'stream',
                'priority' => 1000,
                'options' => array(
                    'stream' => 'data/logs/app.log'
                )
            )
        )
    )
)

我尝试在我的控制器中获取服务实例:

$logger = $this->getServiceLocator()->get('Log\\App');

并抛出异常:

An error occurred
An error occurred during execution; please try again later.
Additional information:
Zend\ServiceManager\Exception\ServiceNotFoundException
File:
/var/openresty/html/skeleton-zf2/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:529
Message:
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Log\App

更新 感谢您的帮助ocramius

我将段移动到module.config.php,这次抛出异常:

Zend\ServiceManager\Exception\ServiceNotCreatedException
File:
/var/openresty/html/skeleton-zf2/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:1070
Message:
An abstract factory could not create an instance of applicationweb(alias: Application\Web).

【问题讨论】:

  • 你能验证Zend\Log\LoggerAbstractServiceFactory#canCreateServiceWithName()是否被调用?另外,你的意思是application.config.php 还是config/autoload 中的什么?

标签: php logging zend-framework2


【解决方案1】:

正如在 IRC 上所讨论的,这里的问题是 2:

  • 您拥有此配置的文件是 config/application.config.php不是模块/合并配置,而是投入使用的文件 "ApplicationConfig"
  • 由于异常,抽象工厂无法实例化服务。为了调试异常,您可以执行以下操作:
try {
    // ...
    $logger = $this->getServiceLocator()->get('Log\\App');
    // ...
} catch (\Exception $e) {
    do {
        var_dump($e->getMessage());
    } while ($e = $e->getPrevious());
}

很可能,您的配置中有一个错误的路径,用于记录必须由日志写入器访问的文件,并且会像我刚刚展示的那样通过跟踪这些异常来出现。

【讨论】:

  • 终于解决了,谢谢。一开始,把application.config.php中的配置放错了地方,有点奇怪。然后目录被selinux禁止。
猜你喜欢
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多