Symfony 生产模式错误报告和 POST 值

Symfony Production Mode Error Reports and POST values

我正在使用 Symfony 4,但我希望这对于 2 和 3 也是一样的。

来自 swift monolog 处理程序的生产模式错误报告 return GET 请求的完整请求 URL,因此在开发中重现错误相当容易。

但是,如果是 POST 请求,您就会遇到麻烦,因为没有提供 POST 值。

我仔细研究了错误处理和日志记录组件,但没有什么是显而易见的。

有没有其他人遇到过这个问题并找到了解决方法?

是的,我对这类难以追踪的问题使用了修复程序。 您可以在 symfony 4 的 config_prod.yml/config/packages/prod/monolog.yaml 中启用 monolog swift 处理程序。这样您将收到一封与发生错误时处于开发模式。 (取决于 action_level)。

symfony 4见下面的代码(你首先需要安装monolog)

    monolog:
      handlers:
        main:
          type:         fingers_crossed
          # 500 errors are logged at the critical level
          action_level: critical
          # to also log 400 level errors (but not 404's):
          # action_level: error
          # excluded_404s:
          #     - ^/
          handler:      deduplicated
        deduplicated:
          type:    deduplication
          handler: swift
        swift:
          type:       swift_mailer
          from_email: '**FROM EMAIL**'
          to_email:   '**TO EMAIL**'
          # or list of recipients
          # to_email:   ['dev1@example.com', 'dev2@example.com', ...]
          subject:    'An Error Occurred! %%message%%'
          level:      debug
          formatter:  monolog.formatter.html
          content_type: text/html

根据 @Puya Sarmidani 的评论...这就是我最后所做的:

config/services.yaml:

App\Services\MonologExtraProcessor:
    tags:
        - { name: monolog.processor }
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

src/Services/MonologExtraProcessor.php:

namespace App\Services;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class MonologExtraProcessor
{
    private $postParams = null;

    public function __invoke(array $record)
    {
        if ($this->postParams !== null) {
            $record['extra']['postParams'] = $this->postParams;
        }
        return $record;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $postParams = $event->getRequest()->request->all();
        $this->postParams = empty($postParams) ? null : serialize($postParams);
    }
}