Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony API平台记录来自请求的标头_Symfony_Logging_Symfony4_Api Platform.com - Fatal编程技术网

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

Symfony API平台记录来自请求的标头,symfony,logging,symfony4,api-platform.com,Symfony,Logging,Symfony4,Api Platform.com,我在生产服务器上遇到了身份验证问题,该问题很可能与代码无关,而是IT配置问题 为了证明这一点,我想检查API平台在尝试获取数据时是否收到授权头。我在API平台文档中没有找到任何关于日志的内容使用Symfony日志系统记录API请求及其标题的正确方法是什么,我知道我无法访问实际的控制器代码,因为它纯粹是使用实体上的ApireSource注释配置的 namespace App\EventListener; use Psr\Log\LoggerInterface; use Symfony\Compo

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

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

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(),
        ]);
    }
}

要明确的是,在本地一切都很好,我这里不是在寻找解决问题的方法,而是使用API平台更改日志格式或向传入请求添加日志的干净方法。

您可以为内核创建侦听器。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
App\EventListener\LogRequestAndResponseEventListener:
    tags:
        - { 'name': 'monolog.logger', 'channel': 'request_log' }
        - { 'name': 'kernel.event_listener', 'event': 'kernel.terminate', 'method': 'onKernelTerminate' }
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(),
        ]);
    }
}
服务。yaml

monolog:
  handlers:
    request_log:
      type: rotating_file
      max_files: 90
      level: debug
      path: '%kernel.logs_dir%/request/%kernel.environment%.log'
      channels: request_log
App\EventListener\LogRequestAndResponseEventListener:
    tags:
        - { 'name': 'monolog.logger', 'channel': 'request_log' }
        - { 'name': 'kernel.event_listener', 'event': 'kernel.terminate', 'method': 'onKernelTerminate' }
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(),
        ]);
    }
}
听众
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(),
        ]);
    }
}

我收到一个错误:无效的服务“App\EventSubscriber\LogRequestAndResponseEventListener”:类“App\EventSubscriber\LogRequestAndResponseEventListener”不存在。此外,我还要三次检查文件(和类名)是否位于正确的位置。如果我在服务中注释第二个标记,错误将停止,但不会记录。。根本没有创建日志文件。可能是什么?谢谢@你能展示一下你的代码吗?您是否更改了services.yaml中的服务定义?@Ihor Kostrov我已经修复了它!我将您的侦听器放在/src/EventListener/LogRequestAndResponseEventListener.php中,然后更新services.yaml中的类路径。路径/EventListener/LogRequestAndResponseEventListener.php(App\EventListener\LogRequestAndResponseEventListener)中没有识别。所以,一切都好!谢谢你的解决方案!向上投票!