2011-11-17 59 views
53

通常你只会得到logger服务,并记录到:如何将来自一个服务的日志写入单独的文件?

%kernel.root_dir%/%kernel.environment%.log 

我想记录的消息形成SOAP服务ONLY到:

%kernel.root_dir%/%kernel.environment%.soap.log 

不是主要日志文件。

我已阅读食谱,但我不明白如何配置monolog。

任何帮助,线索?

+0

我对答案很感兴趣。几周前我问了一个类似的问题:http://stackoverflow.com/questions/7714790/custom-monolog-logging-channel-in-symfony2-command – Reuven

回答

74

MonologBu​​ndle使用相同的处理程序记录整个框架的所有内容。这意味着如果您的某个服务需要登录到不同的处理程序,您应该创建自己的记录器/处理程序并将其注入到您的服务中。

这可能是一个例子配置(在YAML):

services: 
    my_logger: 
     class: Symfony\Bridge\Monolog\Logger 
     arguments: [soap] 
     calls: 
      - [pushHandler, [@my_handler]] 

    my_handler: 
     class: Monolog\Handler\StreamHandler 
     # 200 = INFO, see Monolog::Logger for the values of log levels 
     arguments: [%kernel.root_dir%/%kernel.environment%.soap.log, 200] 

    soap_service: 
     class: Your\Soap\Client 
     arguments: [@my_logger] 

我希望这个澄清它。

更新:因为symfony 2.1的,你也可以配置哪些渠道获得其处理程序,所以你可以交替做这样的事情:

services: 
    soap_service: 
     class: Your\Soap\Client 
     arguments: [@logger] 
     tags: 
      - { name: monolog.logger, channel: soap } 

这将创建一个新的肥皂信道(即记录器实例接收所有的处理程序),然后为这个通道配置不同的处理程序:

monolog: 
    handlers: 
     main: 
      type: stream 
      path: %kernel.root_dir%/%kernel.environment%.log 
      level: error 
      channels: [!soap] 
     soap: 
      type: stream 
      path: %kernel.root_dir%/%kernel.environment%.soap.log 
      level: info 
      channels: [soap] 

这意味着主处理器将接收的一切,但肥皂通道,肥皂处理程序将只接收这样ap频道。如果您希望主日志文件包含所有内容,也可以删除主处理程序上的channels键,但也可以分别仅备份肥皂日志的副本。这带来了很大的灵活性,正如你看到的频道是一个数组,所以你可以列出你想要的频道,或者使用黑名单表示排除一些并包含其他所有内容。

+0

非常好的解决方案 –

+0

非常好的解决方案! – AlterPHP

+2

渠道不好屁股 –

27

我有类似的问题,我选择直接使用Monolog库而不是Monolog服务。

Monolog使用Monolog\Handler\StreamHandler写入文件。该github page有一个简单的例子:

use Monolog\Logger; 
use Monolog\Handler\StreamHandler; 

// create a log channel 
$log = new Logger('name'); 
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); 

// add records to the log 
$log->addWarning('Foo'); 
$log->addError('Bar'); 

它可能仍然使用该服务,只需按一个新的处理程序(和弹出一次,你就大功告成了 - 否则,你可能会在不经意间写的比你想更你的自定义日志),但我没有测试过。说实话,直接使用库似乎更容易。

+2

该软件包不支持其他方式创建不同的日志比基于在记录的层面上。您的解决方案很好,但可能值得在DIC中注册此记录器及其处理程序,以便您可以将其注入模型的任何位置。 –

+1

确实有可能只是推动处理程序并在执行完soap之后弹出它,但在这种情况下要小心,您推送的处理程序应该将'$ bubble = false'传递给它的构造函数,否则之前的处理程序仍然会被调用。你也可以先推动一个NullHandler来压制一切,然后你自己的处理程序只捕捉你感兴趣的级别。 – Seldaek

+7

终于有一些理智,非常感谢你! –

5

我通过在config.yml中创建自定义通道来解决同样的问题,如链接How to Log Messages to different Files中所述。

monolog: 
    channels: ['my_logger'] 

    handlers: 
     my_logger: 
      level: debug 
      type:  stream 
      path:  '%kernel.logs_dir%/my_logger.log' 
      channels: [my_logger] 

在此之后,我可以访问我的looger具有动态创建的服务命名为monolog.logger。my_logger

相关问题