Joh*_*auß 10 php logging monolog symfony-2.1
我想登录与通常的dev.log或prod.log不同的文件
我知道这可以用不同的通道完成,我在几个服务中使用它,但我不太清楚在控制器中切换Monolog通道.
在服务中,您只需通过tags服务定义中的属性定义通道,但是如何在控制器中执行此操作,或者在特定操作中更好?
我知道可能的解决方案是:Symfony 2:登录到特定文件
但是,为登录自定义文件定义两个新服务似乎有些过分.
Sel*_*aek 28
执行此操作的唯一方法是将控制器定义为服务,并使用自定义通道注入自定义记录器.
由于频道是自动创建的,目前没有其他办法,但这是一个有趣的请求而你不是第一个,因此我在MonologBundle上创建了一个问题,允许在捆绑配置级别定义频道.这样你就可以从控制器中获取正确的记录器$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')
小智 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)
| 归档时间: |
|
| 查看次数: |
8643 次 |
| 最近记录: |