首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将一个服务的日志写到单独的文件中?

如何将一个服务的日志写到单独的文件中?
EN

Stack Overflow用户
提问于 2011-11-17 22:50:27
回答 3查看 25.9K关注 0票数 57

通常情况下,您只需获得logger服务,而日志将转到:

代码语言:javascript
复制
%kernel.root_dir%/%kernel.environment%.log

我想将来自SOAP服务的消息记录到:

代码语言:javascript
复制
%kernel.root_dir%/%kernel.environment%.soap.log

而不是主日志文件。

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

有什么帮助吗,线索?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-21 19:16:03

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

这可能是一个示例配置(在yaml中):

代码语言:javascript
复制
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开始,您还可以配置哪些通道接收哪些处理程序,因此您也可以这样做:

代码语言:javascript
复制
services:
     soap_service:
         class: Your\Soap\Client
         arguments: [@logger]
         tags:
             - { name: monolog.logger, channel: soap }

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

代码语言:javascript
复制
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通道。如果希望主日志文件包含所有内容,但只有soap日志的副本,则还可以删除主处理程序上的channels键。这带来了很大的灵活性,正如您所看到的,通道是一个数组,因此您可以列出所需的通道,或者使用黑名单!name表示法来排除某些通道并包含其他所有通道。

票数 80
EN

Stack Overflow用户

发布于 2011-11-17 23:46:25

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

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

代码语言:javascript
复制
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');

也许仍然可以使用该服务并简单地推送一个新的处理程序(并在完成后弹出它-否则您可能会无意中向您的自定义日志中写入比您想要的更多的内容),但我还没有对此进行测试。老实说,直接使用这个库似乎更容易。

票数 31
EN

Stack Overflow用户

发布于 2016-08-10 22:22:06

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

代码语言:javascript
复制
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的动态创建的服务来访问我的looger

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8169114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档