如何将附加信息(主机、URL等)添加到Symfony/Monolog日志输出中


How to add additional information (Host, URL, etc.) to Symfony/Monolog log output?

我正在进行我的第一个基于Symfony的WebApp项目。我已将Symfony配置为不仅将日志消息写入不同的日志文件,还可以立即以电子邮件形式发送严重错误消息。这很好用。但是,我想在默认日志消息中添加一些附加信息,以便更容易地找到实际的错误源。

示例:一个页面的Twig文件从一个.yml文件加载本地化文本。文本包含一个%about_link%占位符,该占位符应替换为"关于"页面的路线/URL。我忘记了这个替换,所以链接没有指向URL,而是指向%about_link%。这导致了NotFoundHttpException,因为找不到到到%about_link%的路由。。。

没什么大不了的。但是要找到包含此错误的实际页面/控制器有点棘手。默认日志消息显示以下内容:

[2015-12-14 17:19:36] request.ERROR: Uncaught PHP Exception Symfony'Component'HttpKernel'Exception'NotFoundHttpException: "No route found for "GET /%25about_link%25"" at /long/path/to/symfony/.../RouterListener.php line 176 []

因此,在尝试查找到%about_link%的路由时,在RouterListener.php中引发了异常。好吧,这并没有给我任何提示这个坏链接位于哪个页面上。

当然,对坏路由的调用根本不必位于任何页面上。用户可能直接输入了错误的链接。Symfony必须存储/记住最后一页,才能给出关于可能来源的任何提示。那么,有可能包含这些信息吗?

此外,我想添加有关报告问题的主机的信息。我正在运行WebApp的两个实例:www.my_web_app.xybetatest.my_web_app.xy,如果日志消息显示它是来自www还是来自betatest,这将是一个很大的帮助。

将这些信息添加到我自己创建的日志消息中是没有问题的,但我如何将这些信息增加到由Symfony或第三方代码生成的消息中?在日志消息到达日志处理程序之前,我必须以某种方式拦截它。这可能吗?

如果您想向日志条目添加额外信息,可以使用处理器来完成。使用处理器,您可以在格式化程序解析记录数组之前对其进行修改。额外的部分显示在日志条目的末尾。

<?php
namespace AppBundle'Monolog;
use Symfony'Component'HttpFoundation'RequestStack;
class WebProcessor
{
    private $requestStack;
    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }
    public function processRecord(array $record)
    {
        $request = $this->requestStack->getCurrentRequest();
        if ($request) {
            $record['extra']['host'] = $request->getHost();
            $record['extra']['url'] = $request->getRequestUri();
            // ...
        }
        return $record;
    }
}

现在将其添加到您的services.yml中,以便为所有日志条目注册:

app.monolog.processor.web:
    class: AppBundle'Monolog'WebProcessor
    arguments: ["@request_stack"]
    tags:
        - { name: monolog.processor, method: processRecord }

不要重新发明轮子!没有必要编写自己的WebProcessor,因为Monolog已经有了它

你唯一要做的就是将它添加到你的服务中,并用monolog.processor:标记它

# app/config/services.yml
services:
    Monolog'Processor'WebProcessor:
        tags: ['monolog.processor']

Monolog有更多的内置处理器可供您使用。我决定在我的应用程序中添加多个处理器:

# app/config/services/monolog.yml (I included services/*.yml in config.yml)
services:
    _defaults:
        tags: ['monolog.processor']
    Monolog'Processor'WebProcessor: ~
    Monolog'Processor'GitProcessor: ~
    Monolog'Processor'MemoryUsageProcessor: ~
    Monolog'Processor'MemoryPeakUsageProcessor: ~
    Monolog'Processor'IntrospectionProcessor: ~

您可以使用自定义格式化程序来更改写入monlog日志文件的输出。您可以在此处找到有关此主题的更多信息:http://symfony.com/doc/current/cookbook/logging/monolog.html#changing-格式化程序

短版本:您可以创建一个实现Monolog''formatter''FormatterInterface的自定义格式化程序类,并可以通过以下方式在config.yml文件中启用它:

# app/config/config.yml
services:
    my_formatter:
        class: Monolog'Formatter'JsonFormatter
monolog:
    handlers:
        file:
            type: stream
            level: debug
            formatter: my_formatter