优雅实现Laravel、Webman、thinkphp三大PHP框架的日志记录功能
在一些管理系统中,经常需要记录客户端请求和响应日志,以便及时排查系统问题和业务审计。今天我们将使用Laravel框架、Webman框架和ThinkPHP框架来实现这样的功能。
Laravel 实现
可以创建自定义提供程序来记录请求和响应。以下是使用服务器提供程序记录请求和响应的一般步骤:
- 创建提供程序类
您可以使用 我们可以在服务提供商处使用 最后在 现在如果有请求,就会记录请求信息。 log,响应时,记录响应信息。您可以在日志文件中查看记录的请求和响应信息。 需要注意的是,如果您想在生产环境中使用此提供程序进行日志记录,则必须确保您的日志文件受到适当的保护,以防止敏感信息泄露。 在Webman中,可以通过创建中间件来实现请求和响应的记录。一般实现步骤如下: 在 Webman 中,记录请求和响应是通过创建中间件类来实现的。以下是中间件类的示例: Webman可以使用em在 将中间件类添加到Webman的路由定义中,例如: 现在当Webman应用程序收到请求时,请求和响应信息都会记录在日志中。您可以在日志文件中看到此信息。 需要注意的是,如果要在生产环境中使用该中间件进行日志记录,必须确保日志文件得到适当的保护,以防止敏感信息泄露。 在ThinkPHP6中记录请求和响应是通过创建中间件来实现的。一般实现步骤如下: 在ThinkPHP6中,捕获请求和响应是通过创建中间件类来实现的。以下是一个示例中间件类: 在ThinkPHP6中php artisan make:provider
Artisan 命令创建提供程序类。 。在服务提供者类中,必须实现register
和boot
方法,其中注册和服务注册是通过容器方法完成的。
别名s❙类。例如:boot
方法用于服务启动时执行的代码。 namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Log;
class LoggingServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot()
{
$this->app['router']->matched(function ($route) {
$logMessage = 'Request: ' . $route->getName() . ' ' . $route->uri() . ' ';
$logMessage .= 'Parameters: ' . json_encode($route->parameters()) . ' ';
Log::info($logMessage);
});
$this->app->make('Illuminate\Contracts\Http\Kernel')->pushMiddleware(LoggingMiddleware::class);
}
}
pushMiddleware
方法将中间件类添加到应用程序中。在此示例中,我们创建一个名为 LoggingMiddleware
的中间件类。该中间件类用于捕获响应日志。 namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Log;
class LoggingMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
Log::info('Response: ' . $response->status() . ' ' . $response->content());
return $response;
}
}
config/app.php
中注册提供者: 'providers' => [
// ...
App\Providers\LoggingServiceProvider::class,
],
Webman实现
namespace App\Middleware;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use Swoole\Coroutine;
class LoggingMiddleware implements MiddlewareInterface
{
public function process(ServerRequestInterface $request, callable $next): ResponseInterface
{
$start = microtime(true);
$response = $next($request);
$end = microtime(true);
$logMessage = 'Request: ' . $request->getMethod() . ' ' . $request->getUri()->getPath() . ' ';
$logMessage .= 'Parameters: ' . json_encode($request->getQueryParams()) . ' ';
$logMessage .= 'Time: ' . round($end - $start, 6) . 's';
Coroutine::create(function () use ($logMessage) {
app('log')->info($logMessage);
});
Coroutine::create(function () use ($response) {
app('log')->info('Response: ' . $response->getStatusCode() . ' ' . $response->getBody());
});
return $response;
}
}
config/app.php
文件中注册中间件类。 。例如:'middleware' => [
// ...
\App\Middleware\LoggingMiddleware::class,
],
use Webman\Route;
Route::get('/', function () {
return 'Hello, Webman!';
})->middleware([\App\Middleware\LoggingMiddleware::class]);
ThinkPHP实现
namespace app\middleware;
use Closure;
class LoggingMiddleware
{
public function handle($request, Closure $next)
{
$start = microtime(true);
$response = $next($request);
$end = microtime(true);
$logMessage = 'Request: ' . $request->method() . ' ' . $request->url() . ' ';
$logMessage .= 'Parameters: ' . json_encode($request->param()) . ' ';
$logMessage .= 'Time: ' . round($end - $start, 6) . 's';
app('log')->info($logMessage);
$logMessage = 'Response: ' . $response->getStatusCode() . ' ' . $response->getContent();
app('log')->info($logMessage);
return $response;
}
}
app/middleware.php
return [
// ...
'logging' => \app\middleware\LoggingMiddleware::class,
];
- 使用中间件
在捕获请求和响应的路由定义中,使用中间件
方法引入中间件。例如:
use think\facade\Route;
Route::get('/', function () {
return 'Hello, ThinkPHP6!';
})->middleware('logging');
现在当ThinkPHP6应用程序收到请求时,请求和响应信息都会记录在日志中。您可以在日志文件中看到此信息。
需要注意的是,如果要在生产环境中使用该中间件进行日志记录,必须确保日志文件得到适当的保护,以防止敏感信息泄露。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。