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

Joh*_*auß 10 php logging monolog symfony-2.1

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

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

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

我知道可能的解决方案是:Symfony 2:登录到特定文件

但是,为登录自定义文件定义两个新服务似乎有些过分.

Sel*_*aek 28

执行此操作的唯一方法是将控制器定义为服务,并使用自定义通道注入自定义记录器.

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

更新:

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

monolog:
    channels: ["foo", "bar"]
Run Code Online (Sandbox Code Playgroud)

然后你可以检索它 $this->get('monolog.logger.mychannel')

  • @JohannesKlauß即将发布的即将发布的捆绑包明天将包含一个适当的解决方案. (2认同)

小智 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]
Run Code Online (Sandbox Code Playgroud)

在我的bundle的services.yml中

acme.logger.user_actions:
    class: Acme\MyBundle\Monolog\UserActionsLogger
    arguments: ['@logger']
    tags:
        - { name: monolog.logger, channel: user_actions }
Run Code Online (Sandbox Code Playgroud)

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

<?php

namespace Acme\MyBundle\Monolog;

class UserActionsLogger
{
    public $logger;

    public function __construct($logger)
    {
        $this->logger = $logger;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

acme.user.authenticationhandler:
    class: %acme.user.authenticationhandler.class%
    public: false
    arguments:  ['@router', '@security.context', '@acme.logger.user_actions']
Run Code Online (Sandbox Code Playgroud)

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

$userActionsLogger = $this->get('acme.logger.user_actions');
Run Code Online (Sandbox Code Playgroud)

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

$userActionsLogger->logger->info('A thing happened!')
Run Code Online (Sandbox Code Playgroud)