如何将日志从一个服务写入单独的文件?

通常情况下,你只需要logger服务,日志转到:

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

我想从SOAP服务中logging消息到:

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

不要主要的日志文件。

我已经阅读了食谱,但我不明白如何configurationmonolog。

任何帮助,线索?

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

这可能是一个configuration示例(在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开始,你也可以configuration哪些通道接收哪些处理程序,所以你可以做这样的事情:

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

其中创build一个新的肥皂通道(即logging器实例接收所有处理程序),然后为此通道configuration不同的处理程序:

 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] 

这意味着主处理程序将接收除soap通道以外的所有内容,soap处理程序将只接收soap通道。 如果您希望主日志文件包含所有内容,也可以删除主处理程序上的channels密钥,但也只能单独备份肥皂日志的副本。 这带来了很大的灵活性,正如你看到的频道是一个数组,所以你可以列出你想要的频道,或使用黑名单!name记号排除一些,并包括一切。

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

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

 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'); 

可能仍然可以使用该服务,只需推送一个新的处理程序(一旦完成后再popup,否则可能会无意中写入超出您想要的自定义日志),但是我没有对此进行testing。 说实话,直接使用库似乎更容易。

我通过在config.yml中创build自定义通道解决了同样的问题,正如本链接如何将消息logging到不同文件中所解释的 。

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

在此之后,我可以通过名为monolog.logger.my_logger的dynamic创build的服务访问我的looger