10

我想登录到与通常的 dev.log 或 prod.log 不同的文件

我知道这可以通过不同的通道来完成,并且我在多个服务中使用了它,但是我不太清楚在控制器中切换 Monolog 通道。

在服务中,您只需通过服务定义中的属性定义通道tags,但是如何在控制器中执行此操作,或者在特定操作中更好地执行此操作?

我知道一个可能的解决方案是:Symfony 2 : Log into a specific file

但是定义两个新服务只是为了记录到自定义文件似乎有点过头了。

4

3 回答 3

28

做到这一点的唯一方法是将控制器定义为服务并注入带有自定义通道的自定义记录器。

由于通道是自动创建的,目前没有其他方法,但这是一个有趣的请求,您不是第一个,所以我在 MonologBu​​ndle 上创建了一个问题,以允许在捆绑配置级别定义通道。这样,您可以使用从控制器中获取正确的记录器$this->get('monolog.logger.mychannel')(如果通道存在,您已经可以这样做,但如果您想要控制器的自定义通道而没有其他用途)。

更新:

从 symfony/monolog-bundle 2.4.0 开始,您可以将其他通道定义为:

monolog:
    channels: ["foo", "bar"]

然后您可以将其检索为$this->get('monolog.logger.mychannel')

于 2013-04-12T08:28:34.560 回答
6

我知道这是一篇较旧的帖子,但我在使用 symfony/monolog-bundle 2.1.x 时遇到了类似的需求。我似乎无法在其他线程中准确找到我需要的东西,所以我在这里记录我的解决方案,即创建一个使用自定义通道的记录器容器。

在 config.yml

monolog:
    handlers:
        user_actions:
            type: stream 
            path:  "%kernel.logs_dir%/%kernel.environment%-user-actions.log"
            level: info 
            channels: [user_actions]

在我的包的 services.yml

acme.logger.user_actions:
    class: Acme\MyBundle\Monolog\UserActionsLogger
    arguments: ['@logger']
    tags:
        - { name: monolog.logger, channel: user_actions }

在 src/Acme/MyBundle/Monolog/UserActionsLogger.php

<?php

namespace Acme\MyBundle\Monolog;

class UserActionsLogger
{
    public $logger;

    public function __construct($logger)
    {
        $this->logger = $logger;
    }
}

然后,您可以将记录器容器注入另一个服务:

acme.user.authenticationhandler:
    class: %acme.user.authenticationhandler.class%
    public: false
    arguments:  ['@router', '@security.context', '@acme.logger.user_actions']

或者,您可以有选择地将记录器容器用作任何控制器中的服务:

$userActionsLogger = $this->get('acme.logger.user_actions');

然后您可以通过以下方式访问实际的记录器:

$userActionsLogger->logger->info('A thing happened!')
于 2015-02-06T19:12:13.503 回答
3

我目前正在使用 symfony/monolog-bundle 2.3.0 并且以下代码有效。

配置在config.yml

monolog:
    handlers:
        main:
            type:  stream
            path:  %kernel.logs_dir%/%kernel.environment%.log
            level: info
        doctrine:
            type:  stream
            path:  %kernel.logs_dir%/doctrine_%kernel.environment%.log
            level: debug
            channels: doctrine

在控制器上

$doctrineLogger = $this->get('monolog.logger.doctrine');

希望能帮助到你。

于 2013-11-23T10:06:42.373 回答