我想登录与通常的dev.log或prod.log
不同的文件我知道这可以通过不同的频道完成,我在几个服务中使用它,但我不太清楚在控制器中切换Monolog频道。
在服务中,您只需通过服务定义中的tags
属性定义频道,但如何在控制器中执行此操作,或者在特定操作中更好?
我知道可能的解决方案是:Symfony 2 : Log into a specific file
但是,为了记录自定义文件而定义两个新服务似乎有点过分了。
答案 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');
希望它有所帮助。