Code前端首页关于Code前端联系我们

优雅实现Laravel、Webman、thinkphp三大PHP框架的日志记录功能

terry 2年前 (2023-09-24) 阅读数 70 #后端开发

在一些管理系统中,经常需要记录客户端请求和响应日志,以便及时排查系统问题和业务审计。今天我们将使用Laravel框架、Webman框架和ThinkPHP框架来实现这样的功能。

Laravel 实现

可以创建自定义提供程序来记录请求和响应。以下是使用服务器提供程序记录请求和响应的一般步骤:

  1. 创建提供程序类

您可以使用 php artisan make:provider Artisan 命令创建提供程序类。 。在服务提供者类中,必须实现registerboot方法,其中注册和服务注册是通过容器方法完成的。 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);
    }
}
  1. 中间件类的实现

我们可以在服务提供商处使用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;
    }
}
  1. 注册提供者

最后在config/app.php中注册提供者:

'providers' => [
    // ...
    App\Providers\LoggingServiceProvider::class,
],

现在如果有请求,就会记录请求信息。 log,响应时,记录响应信息。您可以在日志文件中查看记录的请求和响应信息。

需要注意的是,如果您想在生产环境中使用此提供程序进行日志记录,则必须确保您的日志文件受到适当的保护,以防止敏感信息泄露。

Webman实现

在Webman中,可以通过创建中间件来实现请求和响应的记录。一般实现步骤如下:

  1. 创建中间件类

在 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;
    }
}
  1. 注册中间件类

Webman可以使用em在config/app.php文件中注册中间件类。 。例如:

'middleware' => [
    // ...
    \App\Middleware\LoggingMiddleware::class,
],
  1. 使用中间件

将中间件类添加到Webman的路由定义中,例如:

use Webman\Route;

Route::get('/', function () {
    return 'Hello, Webman!';
})->middleware([\App\Middleware\LoggingMiddleware::class]);

现在当Webman应用程序收到请求时,请求和响应信息都会记录在日志中。您可以在日志文件中看到此信息。

需要注意的是,如果要在生产环境中使用该中间件进行日志记录,必须确保日志文件得到适当的保护,以防止敏感信息泄露。

ThinkPHP实现

在ThinkPHP6中记录请求和响应是通过创建中间件来实现的。一般实现步骤如下:

  1. 创建中间件类

在ThinkPHP6中,捕获请求和响应是通过创建中间件类来实现的。以下是一个示例中间件类:

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;
    }
}
  1. 中间件类注册

在ThinkPHP6中app/middleware.php

别名s❙类。例如:

return [
    // ...
    'logging' => \app\middleware\LoggingMiddleware::class,
];
  1. 使用中间件

在捕获请求和响应的路由定义中,使用中间件方法引入中间件。例如:

use think\facade\Route;

Route::get('/', function () {
    return 'Hello, ThinkPHP6!';
})->middleware('logging');

现在当ThinkPHP6应用程序收到请求时,请求和响应信息都会记录在日志中。您可以在日志文件中看到此信息。

需要注意的是,如果要在生产环境中使用该中间件进行日志记录,必须确保日志文件得到适当的保护,以防止敏感信息泄露。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门