Laravel、Thinkphp和Webman如何实现全局日志

4,195 阅读2分钟

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

Laravel实现

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

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

可以使用 Artisan 命令 php artisan make:provider 来创建服务提供者类。在服务提供者类中,需要实现 registerboot 方法,其中 register 方法用于将服务注册到服务容器中,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,
],

现在,当有请求时,会将请求信息记录到日志中,当响应时,会将响应信息记录到日志中。你可以在日志文件中查看记录的请求和响应信息。

需要注意的是,如果你想在生产环境中使用这个服务提供者记录日志,你需要确保对日志文件进行适当的保护,以防止敏感信息泄露。

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 的 config/app.php 文件中,可以使用 middleware 配置项注册中间件类。例如:

'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 文件中,可以使用 alias 方法注册中间件类。例如:

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

在需要记录请求和响应的路由定义中,使用 middleware 方法引入中间件。例如:

use think\facade\Route;

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

现在,当 ThinkPHP6 应用程序收到请求时,将记录请求信息和响应信息到日志中。你可以在日志文件中查看这些信息。

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