【问题标题】:Slim : how to log all request to the frameworkSlim:如何将所有请求记录到框架
【发布时间】:2019-07-10 19:53:39
【问题描述】:

我想将所有请求记录到我的 Slim Rest 服务器。 200 正常,404 错误等...

使用以下代码,我只能记录异常。我想记录所有传入的请求。

require 'Slim/Slim.php';

\Slim\Slim::registerAutoloader();

require 'Slim/Extras/Log/DateTimeFileWriter.php';

$app = new \Slim\Slim (
    array(
        'debug' => true,
        'log.enabled' => true,
        'log.level' => \Slim\Log::DEBUG,
        'log.writer' => new \Slim\Extras\Log\DateTimeFileWriter(array(
            'path' => '/tmp/slim',
            'name_format' => 'Y-m-d',
            'message_format' => '%label% - %date% - %message%'
        ))
    )
);

【问题讨论】:

    标签: php slim


    【解决方案1】:

    有了 slim v3,你 can't use hooks anymore.

    这是我想出的解决方案:

    添加一个新的中间件

    可以将中间件视为应用于每个传入请求的函数。因此,它会拦截每个请求,允许我们记录所需的一切。

    use \Psr\Http\Message\ServerRequestInterface as Request;
    use \Psr\Http\Message\ResponseInterface as Response;
    
    $app->add(function (Request $request, Response $response, callable $next) {
        $route = $request->getAttribute('route');
        $this->logger->info($request->getMethod() . ' ' . $route->getPattern(), [$route->getArguments()]);
        $response = $next($request, $response);
        $this->logger->info($response->getStatusCode() . ' ' . $response->getReasonPhrase(), [(string)$response->getBody()]);
    
        return $response;
    });
    

    记录器设置

    当然,你需要像这样在容器中设置 Logger 依赖

    $container = $app->getContainer();
    
    // monolog
    $container['logger'] = function ($c) {
        $settings = $c->get('settings')['logger'];
        $logger = new Monolog\Logger($settings['name']);
        $logger->pushProcessor(new Monolog\Processor\UidProcessor());
        $logger->pushHandler(new Monolog\Handler\StreamHandler($settings['path'], $settings['level']));
        return $logger;
    };
    

    使用记录器设置

    return [
        'determineRouteBeforeAppMiddleware' => true, //VERY IMPORTANT for route logging
        'settings' => [
            // Monolog settings
            'logger' => [
                'name' => 'slim-app',
                'path' => __DIR__ . '/../logs/app.log',
                'level' => \Monolog\Logger::DEBUG,
            ]
        ]
    ]
    

    输出

    [2017-06-18 03:40:19] slim-app.INFO: GET /api/publication/{id:[0-9]+} [{"id":"0"}] {"uid":"6e64305"}
    [2017-06-18 03:40:19] slim-app.INFO: 200 OK ["[]"] {"uid":"6e64305"}
    

    希望这对某人有所帮助

    【讨论】:

      【解决方案2】:

      看起来您想要基于您的问题的响应数据:

      200 正常,404 错误等...

      无论您需要请求还是响应信息,您都可以使用Slim Hooks 做您想做的事情。我现在无法提供完整的示例,但在未经测试的、无法理解的代码中,它可能看起来像:

      // slim.after.dispatch would probably work just as well. Experiment
      $app->hook('slim.after.router', function () use ($app) {
          $request = $app->request;
          $response = $app->response;
      
          $app->log->debug('Request path: ' . $request->getPathInfo());
          $app->log->debug('Response status: ' . $response->getStatus());
          // And so on ...
      });
      

      【讨论】:

      • 所有请求将在哪里记录?
      • @VivekSancheti 这是基于配置的——你告诉记录器在哪里写入文件。 OP 的示例记录到/tmp/slim
      • 参见提到的 'path' => '/tmp/slim', .它的根 tmp 。如果您需要在同一个地方登录,请使用 __DIR__ . '/slim.txt' 之类的东西。
      猜你喜欢
      • 2019-10-04
      • 2015-10-24
      • 2012-12-19
      • 2015-03-13
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 2017-10-15
      • 2013-06-12
      相关资源
      最近更新 更多