Symfony2/Monolog:日志级别 - 仅显示 app.INFO?

Posted

技术标签:

【中文标题】Symfony2/Monolog:日志级别 - 仅显示 app.INFO?【英文标题】:Symfony2/Monolog: Log Level - only show app.INFO? 【发布时间】:2012-04-17 23:54:10 【问题描述】:

我正在使用 Symfony2 和 monolog 在定义的日志文件 (mylogfile.log) 中写入特定日志:

#config_dev.yml
monolog:
    handlers:
        main:
           type:  stream
           path:  %kernel.logs_dir%/%kernel.environment%.log
           level: debug
       file:
           type:   stream
           path:   %kernel.logs_dir%/mylogfile.log
           level:  info

我正在通过以下方式访问控制器中的日志文件:

    $logger = $this->get('logger'); // Log
    $logger->info('somelogcontent');

现在我的问题是我的日志文件包含整个信息级别,这意味着它为我提供了所有 app.INFO 日志(这是我想要的)和 request.INFO(我真的不需要):

[2012-04-04 11:13:17] request.INFO: Matched route ... blablabla
[2012-04-04 11:13:17] app.INFO: somelogcontent
...

有什么方法可以不记录 Request.INFO?

迈克

【问题讨论】:

【参考方案1】:

您必须创建一个新的记录器服务,该服务应该在您的课程中使用。像这样,config.yml:

services:
  my_logger:
    class: Monolog\Logger
    arguments: [my_info]
    calls:
        - [pushHandler, [@my_log_handler]]

  my_log_handler:
    class: Monolog\Handler\StreamHandler
    arguments: [%kernel.root_dir%/logs/my_info.log, 100]

用法(例如Controller):

$this->get('my_logger')->info('info message');

更多详细信息在symfony cookbook。

【讨论】:

如果你想升级'my_logger'处理程序怎么办?即,假设您在控制器中设置了所有不同级别的消息。使用若干 info、alert、err 方法。您如何在特定时刻告诉配置只是在日志中写入具有警告或更高相关性(警报或错误)的日志,而不是写入信息和警告?有机会这样做吗? 不确定我是否正确理解了这个问题,但我会尽力回答。您必须将处理程序中的参数(现在是 100)更改为另一个数字(例如,“200”以减少日志记录)。检查Monolog\Monolog 中的实际值。这样做你的代码会像往常一样调用 info/debug/error 方法,但只会记录值为 200 或更高的那些。 您完全理解了我的问题,并且实际上解决了我的问题。老实说,我不知道那个参数是干什么用的。丢人现眼。非常感谢【参考方案2】:

使用 MonologBu​​ndle 的 2.4 及更高版本(注意,MonologBu​​ndle 的发布周期不再与 symfony 同步),您现在可以通过配置非常简单地定义新通道,而无需定义服务。

monolog:
    channels: ["my_channel"]
    handlers:
       file:
           type:   stream
           path:   %kernel.logs_dir%/mylogfile.log
           level:  info
           channels: my_channel

现在只需在控制器中为新通道自动创建记录器:

$logger = $this->get('monolog.logger.my_channel');
$logger->info('somelogcontent');

我知道老问题,但应该提到 MonologBundle ~2.4 的这个新功能。

【讨论】:

monolog.logger.my_logger - 应该是 monolog.logger.my_channel 吗?【参考方案3】:

您可以设置用户警报级别。 文件: 类型:流 路径:%kernel.logs_dir%/mylogfile.log 级别:警报

$logger = $this->get('logger'); // Log
$logger->alert('somelogcontent');

【讨论】:

【参考方案4】:

此日志消息来自 router_listener 服务。您可以在服务配置文件中重新定义它。

我在主包 config/services.yml 中做了什么:

services:

    # ...

    router_listener:
        class:  %router_listener.class%
        arguments: ['@router', %request_listener.http_port%, %request_listener.https_port%]
        tags:
            -  name: kernel.event_listener, event: kernel.request, method: onEarlyKernelRequest 
            -  name: kernel.event_listener, event: kernel.request, method: onKernelRequest 

它使“匹配路由...”日志消息不被记录(因为 RouterListener 在其构造函数参数中没有记录器服务)。

【讨论】:

这其实很酷。当我再次遇到同样的问题时,我只是查看了我的旧帖子。 ;) 非常感谢!【参考方案5】:

在您的 config\packages\monolog.yaml 文件中添加“app”特定通道

monolog:
    handlers:
        info:
            type:  rotating_file
            path:  '%kernel.logs_dir%/info_%kernel.environment%_info.log'
            level: info
            max_files: 10
            channels: app

我使用 symfony 4(或 5)

【讨论】:

【参考方案6】:

添加你的独白配置 例如,如果我使用 handler:test

test:
    type: filter
    accepted_levels: [info]
    handler: test_info
test_info:
    type: stream // many possibilities(rotating_file..)
    level: info
    path: // the path where you save file log

【讨论】:

以上是关于Symfony2/Monolog:日志级别 - 仅显示 app.INFO?的主要内容,如果未能解决你的问题,请参考以下文章

Graylog2 与 Symfony 2 (Monolog)

仅当存在警告或更严重级别的日志事件时记录所有级别

如何仅为应用程序控制器启用日志记录调试级别?

如何配置仅在错误级别写入输出的自定义 zap 记录器?

如何将python日志记录级别名称转换为整数代码

monkey介绍