Symfony 2.1 - 在控制器中切换Monolog通道

时间:2013-04-12 08:05:23

标签: php logging symfony-2.1 monolog

我想登录与通常的dev.log或prod.log

不同的文件

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

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

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

但是,为了记录自定义文件而定义两个新服务似乎有点过分了。

3 个答案:

答案 0 :(得分:26)

执行此操作的唯一方法是定义controller as a service并使用自定义渠道注入自定义记录器。

由于频道是自动创建的,目前没有其他办法,但这是一个有趣的请求而你不是第一个,所以我创建了一个issue on MonologBundle来允许在捆绑配置级别定义频道。这样你就可以使用$this->get('monolog.logger.mychannel')从控制器中获取正确的记录器(如果存在通道,你可以这样做,但如果你想要一个没有其他用途的控制器的自定义通道则不行。)

<强>更新

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

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

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

答案 1 :(得分:5)

我知道这是一篇较旧的文章,但是我使用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]

在我的捆绑服务中.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!')

答案 2 :(得分: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');

希望它有所帮助。