PHP三大主流框架 如何优雅的实现日志功能
在一些管理系统中,经常会要求记录客户端的请求和响应日志,方便系统出现问题及时的排查,以及业务的核查。今天就用Laravel框架、Webman框架和ThinkPHP框架来实现这样的功能。
Laravel实现
可以创建一个自定义的服务提供者来记录请求和响应日志。下面是使用服务器提供者记录请求日志和响应日志的一般步骤:
- 创建一个服务提供者类
可以使用 Artisan 命令 php artisan make:provider
来创建服务提供者类。在服务提供者类中,需要实现 register
和 boot
方法,其中 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);
}
}
- 实现中间件类
在服务提供者中,可以使用 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;
}
}
- 注册服务提供者
最后,在 config/app.php
文件中注册服务提供者:
'providers' => [
// ...
App\Providers\LoggingServiceProvider::class,
],
现在,当有请求时,会将请求信息记录到日志中,当响应时,会将响应信息记录到日志中。你可以在日志文件中查看记录的请求和响应信息。
需要注意的是,如果你想在生产环境中使用这个服务提供者记录日志,你需要确保对日志文件进行适当的保护,以防止敏感信息泄露。
Webman实现
在 Webman 中,可以通过创建一个中间件来实现请求和响应的记录。下面是一般的实现步骤:
- 创建一个中间件类
在 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;
}
}
- 注册中间件类
在 Webman 的 config/app.php
文件中,可以使用 middleware
配置项注册中间件类。例如:
'middleware' => [
// ...
\App\Middleware\LoggingMiddleware::class,
],
- 使用中间件
将中间件类添加到 Webman 的路由定义中,例如:
use Webman\Route;
Route::get('/', function () {
return 'Hello, Webman!';
})->middleware([\App\Middleware\LoggingMiddleware::class]);
现在,当 Webman 应用程序收到请求时,将记录请求信息和响应信息到日志中。你可以在日志文件中查看这些信息。
需要注意的是,如果你想在生产环境中使用这个中间件记录日志,你需要确保对日志文件进行适当的保护,以防止敏感信息泄露。
ThinkPHP实现
在 ThinkPHP6 中,可以通过创建中间件来实现请求和响应的记录。下面是一般的实现步骤:
- 创建一个中间件类
在 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;
}
}
- 注册中间件类
在 ThinkPHP6 的 app/middleware.php
文件中,可以使用 alias
方法注册中间件类。例如:
return [
// ...
'logging' => \app\middleware\LoggingMiddleware::class,
];
- 使用中间件
在需要记录请求和响应的路由定义中,使用 middleware
方法引入中间件。例如:
use think\facade\Route;
Route::get('/', function () {
return 'Hello, ThinkPHP6!';
})->middleware('logging');
现在,当 ThinkPHP6 应用程序收到请求时,将记录请求信息和响应信息到日志中。你可以在日志文件中查看这些信息。
需要注意的是,如果你想在生产环境中使用这个中间件记录日志,你需要确保对日志文件进行适当的保护,以防止敏感信息泄露。