Slim:如何将所有请求记录到框架中

use*_*715 5 php slim

我想将所有请求记录到我的Slim Rest服务器.200 ok,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%'
        ))
    )
);
Run Code Online (Sandbox Code Playgroud)

Gab*_*ult 12

使用纤薄的v3,您不能再使用挂钩了.

这是我提出的解决方案:

添加一个新的中间件

中间件可以看作是应用于每个传入请求的函数.因此,它会截取每个请求,允许我们记录我们需要的所有内容.

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;
});
Run Code Online (Sandbox Code Playgroud)

记录器设置

当然,您需要在容器中设置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;
};
Run Code Online (Sandbox Code Playgroud)

使用记录器设置

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

产量

[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"}
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人


Jer*_*all 8

看起来您想根据您的问题回复数据:

200 ok,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 ...
});
Run Code Online (Sandbox Code Playgroud)