Slim : how to log all request to the framework Slim : how to log all request to the framework php php

Slim : how to log all request to the framework


With slim v3, you can't use hooks anymore.

Here is the solution I came up with :

Add a new middleware

A middleware can be seen as a function which is applied to every incoming request. Therefore, it sort of intercepts every request, allowing us to log everything we need.

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 settings

Of course, you need to setup the Logger dependency in the container like so

$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;};

With the logger settings

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

Output

[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"}

Hope this helps someone


Looks like you want Response data based on your question:

200 ok, 404 errors, etc...

Regardless of whether you want request or response info, you can do what you're wanting to do using Slim Hooks. I can't provide a complete example now, but in untested, off-the-top-of-my-head code, it might look like:

// 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 ...});