目的
记录每一条http请求记录及其响应值
发现
namespace Illuminate\Foundation\Http;
//省略......
class Kernel implements KernelContract
{
//省略......
public function handle($request)
{
try {
$request->enableHttpMethodParameterOverride();
$response = $this->sendRequestThroughRouter($request);
} catch (Throwable $e) {
$this->reportException($e);
$response = $this->renderException($request, $e);
}
//最后响应前分发了RequestHandled的事件,可以通过监听该事件获取http完整的请求和响应
$this->app['events']->dispatch(
new RequestHandled($request, $response)
);
return $response;
}
//省略......
}
监听记录
namespace App\Providers;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Http\Events\RequestHandled;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Log;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array<class-string, array<int, class-string>>
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
//监听记录request&response laravel8 可以这么写
Event::listen(function (RequestHandled $event) {
$request = $event->request;
$headers = $request->headers->all();
$response = $event->response;
$requestInfo = [
'uri' => $request->url(),
'method' => $request->method(),
'headers' => $headers,
'body' => $request->input()
];
$exception = $response->exception;
$responseInfo = [
'body' => $response->getStatusCode() == 200 ? $response->getContent() : sprintf('code error File: %s Line: %s Message: %s', $exception->getFile(), $exception->getLine(), $exception->getMessage()),
'statusCode' => $response->getStatusCode(),
'statusText' => $response->statusText(),
];
Log::info('log listen', ['request' => $requestInfo, 'response' => $responseInfo]);
});
}
}