PHP三大主流框架Laravel、Webman、thinkphp 如何优雅的实现日志功能

2023-06-1017:42:28后端程序开发Comments3,568 views字数 4228阅读模式

一些管理系统中,经常会要求记录客户端的请求和响应日志,方便系统出现问题及时的排查,以及业务的核查。今天就用Laravel框架、Webman框架和ThinkPHP框架来实现这样的功能。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

Laravel实现

可以创建一个自定义的服务提供者来记录请求和响应日志。下面是使用服务器提供者记录请求日志和响应日志的一般步骤:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

  1. 创建一个服务提供者类

可以使用 Artisan 命令 php artisan make:provider 来创建服务提供者类。在服务提供者类中,需要实现 register 和 boot 方法,其中 register 方法用于将服务注册到服务容器中,boot 方法用于服务启动时执行的代码。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

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 的中间件类。该中间件类用于记录响应日志。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

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 文件中注册服务提供者:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

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

现在,当有请求时,会将请求信息记录到日志中,当响应时,会将响应信息记录到日志中。你可以在日志文件中查看记录的请求和响应信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

需要注意的是,如果你想在生产环境中使用这个服务提供者记录日志,你需要确保对日志文件进行适当的保护,以防止敏感信息泄露。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

Webman实现

在 Webman 中,可以通过创建一个中间件来实现请求和响应的记录。下面是一般的实现步骤:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

  1. 创建一个中间件类

在 Webman 中,可以通过创建中间件类来实现请求和响应的记录。下面是一个示例中间件类:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

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 的 config/app.php 文件中,可以使用 middleware 配置项注册中间件类。例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

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

将中间件类添加到 Webman 的路由定义中,例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

use Webman\Route;

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

现在,当 Webman 应用程序收到请求时,将记录请求信息和响应信息到日志中。你可以在日志文件中查看这些信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

需要注意的是,如果你想在生产环境中使用这个中间件记录日志,你需要确保对日志文件进行适当的保护,以防止敏感信息泄露。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

ThinkPHP实现

在 ThinkPHP6 中,可以通过创建中间件来实现请求和响应的记录。下面是一般的实现步骤:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

  1. 创建一个中间件类

在 ThinkPHP6 中,可以通过创建中间件类来实现请求和响应的记录。下面是一个示例中间件类:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

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 文件中,可以使用 alias 方法注册中间件类。例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

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

在需要记录请求和响应的路由定义中,使用 middleware 方法引入中间件。例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

use think\facade\Route;

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

现在,当 ThinkPHP6 应用程序收到请求时,将记录请求信息和响应信息到日志中。你可以在日志文件中查看这些信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

需要注意的是,如果你想在生产环境中使用这个中间件记录日志,你需要确保对日志文件进行适当的保护,以防止敏感信息泄露。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/46830.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/46830.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定