通常你只会得到logger
服务,并记录到:如何将来自一个服务的日志写入单独的文件?
%kernel.root_dir%/%kernel.environment%.log
我想记录的消息形成SOAP服务ONLY到:
%kernel.root_dir%/%kernel.environment%.soap.log
不是主要日志文件。
我已阅读食谱,但我不明白如何配置monolog。
任何帮助,线索?
通常你只会得到logger
服务,并记录到:如何将来自一个服务的日志写入单独的文件?
%kernel.root_dir%/%kernel.environment%.log
我想记录的消息形成SOAP服务ONLY到:
%kernel.root_dir%/%kernel.environment%.soap.log
不是主要日志文件。
我已阅读食谱,但我不明白如何配置monolog。
任何帮助,线索?
MonologBundle使用相同的处理程序记录整个框架的所有内容。这意味着如果您的某个服务需要登录到不同的处理程序,您应该创建自己的记录器/处理程序并将其注入到您的服务中。
这可能是一个例子配置(在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
键,但也可以分别仅备份肥皂日志的副本。这带来了很大的灵活性,正如你看到的频道是一个数组,所以你可以列出你想要的频道,或者使用黑名单表示排除一些并包含其他所有内容。
我有类似的问题,我选择直接使用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');
它可能仍然使用该服务,只需按一个新的处理程序(和弹出一次,你就大功告成了 - 否则,你可能会在不经意间写的比你想更你的自定义日志),但我没有测试过。说实话,直接使用库似乎更容易。
该软件包不支持其他方式创建不同的日志比基于在记录的层面上。您的解决方案很好,但可能值得在DIC中注册此记录器及其处理程序,以便您可以将其注入模型的任何位置。 –
确实有可能只是推动处理程序并在执行完soap之后弹出它,但在这种情况下要小心,您推送的处理程序应该将'$ bubble = false'传递给它的构造函数,否则之前的处理程序仍然会被调用。你也可以先推动一个NullHandler来压制一切,然后你自己的处理程序只捕捉你感兴趣的级别。 – Seldaek
终于有一些理智,非常感谢你! –
我通过在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
我对答案很感兴趣。几周前我问了一个类似的问题:http://stackoverflow.com/questions/7714790/custom-monolog-logging-channel-in-symfony2-command – Reuven