前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ThinkPHP、Laravel和Webman如何实现统一日志功功能

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

原创
作者头像
Mandy的名字被占用了
修改2023-05-18 02:19:37
5620
修改2023-05-18 02:19:37
举报

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

Laravel实现

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

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

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

代码语言:php
复制
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 的中间件类。该中间件类用于记录响应日志。

代码语言:php
复制
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 文件中注册服务提供者:

代码语言:php
复制
'providers' => [
    // ...
    App\Providers\LoggingServiceProvider::class,
],

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

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

Webman实现

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

  1. 创建一个中间件类

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

代码语言:php
复制
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 配置项注册中间件类。例如:

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

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

代码语言:php
复制
use Webman\Route;

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

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

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

ThinkPHP实现

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

  1. 创建一个中间件类

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

代码语言:php
复制
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 方法注册中间件类。例如:

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

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

代码语言:php
复制
use think\facade\Route;

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

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • Laravel实现
  • Webman实现
  • ThinkPHP实现
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档