easycorp / easy-log-handler
Monolog的处理程序,它优化日志消息以供人类而非软件处理。通过易于理解的日志提高您的生产力。
Requires
- php: >=7.1
- monolog/monolog: ~1.6|~2.0
- symfony/yaml: ^3.4|^4.0|^5.0
README
Symfony日志文件在所有环境中格式相同。这意味着 dev.log
优化为供机器而非人类使用。结果是日志文件充满了无用信息,使您工作效率降低。
EasyLogHandler 是一个新的 Monolog 处理程序,可创建友好的日志文件。它优化以以清晰简洁的方式显示日志信息。在开发环境中使用它,成为更高效的开发者。
特性
以下是 EasyLogHandler 的最佳特性以及它如何与默认的 Symfony 日志进行比较。
更好的日志结构
Symfony 日志文件是一大堆文本。当你打开它们时,你很难判断一个请求何时开始或结束,哪些日志消息属于一组。
Symfony | EasyLogHandler |
---|---|
![]() |
![]() |
EasyLogHandler 以不同的方式组织日志文件
- 它添加了一个大的标题和一些新行来分隔每个请求的日志;
- 如果请求不太重要(例如 Assetic 请求),则标题更紧凑,显示的信息更少;
- 日志消息在内部被分割,这样你可以更好地理解它们的各个部分(请求、doctrine、安全等)
更简洁的日志
首先,EasyLogHandler 并不在每个日志消息中显示时间戳。在 dev
环境中,你不必关心这个,所以时间戳只在每个日志消息组中显示一次。
Symfony | EasyLogHandler |
---|---|
![]() |
![]() |
extra
信息,即一些日志消息包含的以添加更多日志细节的信息,只有在与上一个日志不同时才显示。相比之下,Symfony 总是显示所有日志的 extra
,生成大量重复信息。
Symfony |
---|
![]() |
EasyLogHandler |
---|
![]() |
在日志消息中使用占位符(例如 Matched route "{route}".
而不是 Matched route "home".
)越来越受欢迎。这对机器来说很好,因为它们可以分组只在不同占位符值中变化的类似消息。
然而,对于人类来说,“功能”却令人烦恼。这就是为什么 EasyLogHandler 会自动替换日志消息中包含的任何占位符。
Symfony |
---|
![]() |
EasyLogHandler |
---|
![]() |
更好的视觉层次
重要元素,如弃用和安全相关消息,必须在日志文件中突出显示,以帮助您立即发现它们。然而,在 Symfony 中,所有日志看起来都完全一样。你如何知道哪些是重要的呢?
Symfony |
---|
![]() (所有消息看起来完全一样) |
EasyLogHandler |
---|
![]() (弃用、警告、错误和安全消息突出显示) |
动态变量内联
日志消息通常在其 context
和 extra
属性中包含相关的变量。在日志文件中显示这些变量的内容始终是在可读性和简洁性之间做出艰难的平衡。
EasyLogHandler根据每个日志消息动态决定如何内联这些变量。例如,Doctrine查询参数始终内联,但对于不重要请求,请求参数内联,对于重要请求则嵌套。
堆栈跟踪
当日志消息包含错误堆栈跟踪时,您肯定想查看它们。然而,Symfony将堆栈跟踪内联显示,使其无法进行检查。EasyLogHandler以正确的堆栈跟踪形式显示它们。
Symfony |
---|
![]() |
EasyLogHandler |
---|
![]() |
日志消息分组
在检查日志文件时,最令人沮丧的经历之一是看到大量重复或连续相似的日志消息。它们提供的信息很少,只会分散您的注意力。EasyLogHandler一次性处理所有日志消息,而不是逐个处理,因此它知道何时有相似的连续日志。
例如,这是一个显示三个连续丢失翻译消息的Symfony日志文件。
这是EasyLogHandler显示相同消息的方式。
对于通常生成数十个连续消息的“事件通知”消息,差异更为明显。
Symfony |
---|
![]() |
EasyLogHandler |
---|
![]() |
安装
该项目作为PHP包而不是Symfony捆绑包分发,因此您只需要使用Composer来要求该项目。
$ composer require --dev easycorp/easy-log-handler
配置和使用
步骤1
为这个日志处理器在您的应用程序中定义一个新的服务。
较新版本的Symfony
# config/packages/dev/easy_log_handler.yaml services: EasyCorp\EasyLog\EasyLogHandler: public: false arguments: ['%kernel.logs_dir%/%kernel.environment%.log']
较旧版本的Symfony
# app/config/services.yml services: # ... easycorp.easylog.handler: class: EasyCorp\EasyLog\EasyLogHandler public: false arguments: - '%kernel.logs_dir%/%kernel.environment%.log'
步骤2
更新您的dev
环境中的Monolog配置,以定义一个包装此新处理器服务的缓冲处理器(继续阅读以了解原因)。您可以安全地复制并粘贴此配置。
较新版本的Symfony
# config/packages/dev/monolog.yaml monolog: handlers: buffered: type: buffer handler: easylog channels: ['!event'] level: debug easylog: type: service id: EasyCorp\EasyLog\EasyLogHandler
较旧版本的Symfony
# app/config/config_dev.yml monolog: handlers: buffered: type: buffer handler: easylog channels: ["!event"] level: debug easylog: type: service id: easycorp.easylog.handler
大多数日志处理器将每个日志消息分别处理。相比之下,EasyLogHandler高级日志处理需要每个日志消息都了解其他日志(例如合并相似的连续日志)。这意味着必须捕获并批量处理与请求相关的所有日志。
在上面的配置中,buffered
处理器保存所有日志消息,然后将它们传递给EasyLog处理器,该处理器一次性处理所有消息并将结果写入日志文件。
使用buffered
处理器来配置记录/排除的通道以及记录的消息级别。