ThinkPHP、Laravel和Webman如何实现统一日志功功能

2023-05-18 02:19:37 浏览数 (4)

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

Laravel实现

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

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

可以使用 Artisan 命令 php artisan make:provider 来创建服务提供者类。在服务提供者类中,需要实现 registerboot 方法,其中 register 方法用于将服务注册到服务容器中,boot 方法用于服务启动时执行的代码。

代码语言:php复制
namespace AppProviders;

use IlluminateSupportServiceProvider;
use IlluminateSupportFacadesLog;

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('IlluminateContractsHttpKernel')->pushMiddleware(LoggingMiddleware::class);
    }
}
  1. 实现中间件类

在服务提供者中,可以使用 pushMiddleware 方法将中间件类添加到应用程序中。在本例中,我们将创建一个名为 LoggingMiddleware 的中间件类。该中间件类用于记录响应日志。

代码语言:php复制
namespace AppHttpMiddleware;

use Closure;
use IlluminateSupportFacadesLog;

class LoggingMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        Log::info('Response: ' . $response->status() . ' ' . $response->content());
        return $response;
    }
}
  1. 注册服务提供者

最后,在 config/app.php 文件中注册服务提供者:

代码语言:php复制
'providers' => [
    // ...
    AppProvidersLoggingServiceProvider::class,
],

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

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

Webman实现

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

  1. 创建一个中间件类

在 Webman 中,可以通过创建中间件类来实现请求和响应的记录。下面是一个示例中间件类:

代码语言:php复制
namespace AppMiddleware;

use WebmanMiddlewareInterface;
use WebmanHttpResponse;
use PsrHttpMessageServerRequestInterface;
use PsrHttpMessageResponseInterface;
use SwooleCoroutine;

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 配置项注册中间件类。例如:

代码语言:php复制
'middleware' => [
    // ...
    AppMiddlewareLoggingMiddleware::class,
],
  1. 使用中间件

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

代码语言:php复制
use WebmanRoute;

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

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

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

ThinkPHP实现

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

  1. 创建一个中间件类

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

代码语言:php复制
namespace appmiddleware;

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 方法注册中间件类。例如:

代码语言:php复制
return [
    // ...
    'logging' => appmiddlewareLoggingMiddleware::class,
];
  1. 使用中间件

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

代码语言:php复制
use thinkfacadeRoute;

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

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

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

0 人点赞