来自请求的 API 平台记录标头

man*_*anu 4 logging symfony api-platform.com symfony4

我在生产服务器上遇到身份验证问题,该问题很可能与代码无关,而是 IT 配置问题...

为了证明这一点,我想检查 API 平台在尝试获取数据时是否收到授权标头。我在 API 平台文档中没有找到任何关于日志的信息。使用 Symfony 日志系统记录 API 请求及其标头的正确方法是什么,知道我无权访问实际的控制器代码,因为它纯粹是使用实体上的 APIRessource 注释配置的?

需要明确的是,在本地一切正常,我不是在这里寻找解决我的问题的方法,只是一种使用 API 平台更改日志格式或将日志添加到传入请求的干净方法。

Iho*_*rov 6

您可以为 kernel.terminate 事件创建一个监听器,这将记录请求和响应数据。像这样的东西。

monolog.yaml

monolog:
  handlers:
    request_log:
      type: rotating_file
      max_files: 90
      level: debug
      path: '%kernel.logs_dir%/request/%kernel.environment%.log'
      channels: request_log
Run Code Online (Sandbox Code Playgroud)

服务.yaml

App\EventListener\LogRequestAndResponseEventListener:
    tags:
        - { 'name': 'monolog.logger', 'channel': 'request_log' }
        - { 'name': 'kernel.event_listener', 'event': 'kernel.terminate', 'method': 'onKernelTerminate' }
Run Code Online (Sandbox Code Playgroud)

听众

namespace App\EventListener;

use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\TerminateEvent;

class LogRequestAndResponseEventListener
{
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function onKernelTerminate(TerminateEvent $event)
    {
        $request = $event->getRequest();
        $response = $event->getResponse();

        $this->logger->info('data', [
            'route' => $request->getMethod() . ' ' . $request->getRequestUri(),
            'status' => $response->getStatusCode(),
            'request body' => $request->request->all(),
            'response' => json_decode($response->getContent(), true),
            'headers' => $request->headers->all(),
        ]);
    }
}
Run Code Online (Sandbox Code Playgroud)