如何向Symfony / Monolog日志输出添加其他信息(主机,URL等)?

时间:2015-12-15 08:11:01

标签: php symfony logging monolog

我正在开发我的第一个基于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 []

因此,在尝试查找到RouterListener.php的路由时,%about_link%会抛出异常。好的,这并没有给我任何关于这个坏链接所在页面的提示。

当然,对不良路线的呼叫根本不必位于任何页面上。用户可能直接输入了错误的链接。 Symfony必须存储/记住最后一页,以提供有关可能来源的任何提示。那么,是否有可能包含这些信息?

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

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

3 个答案:

答案 0 :(得分:14)

如果要向日志条目添加额外信息,可以使用处理器执行此操作。使用处理器,您可以在格式化程序解析之前修改记录数组。额外部分显示在日志条目的末尾。

<?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 }

答案 1 :(得分:5)

不要重新发明轮子!由于Monolog already has it

,因此无需编写自己的WebProcessor

您唯一需要做的就是将其添加到您的服务中并使用<script> function getEvents() { $.ajax({ dataType: 'json', type: "POST", url: '@Url.Action("seen","Ajax")', cache: false, async: false, error: function (xhr, status, error) { }, }); } </script> 标记:

monolog.processor

Monolog甚至可以使用more built-in processors。我决定在我的应用程序中添加多个处理器:

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

答案 2 :(得分:1)

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

简短版本:您可以创建一个实现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