之前的文章中,我们提到了基于PHP Monolog打造一个API日志记录器,链接在此,基于PHP Monolog,打造一个API请求日志记录器
而本文中,我们将介绍如何在Laravel简洁快速的使用它。
composer require pianzhou/monolog comopser require pianzhou/laravel
1、开始之前,我们新建一个数据表,以MySQL为例:
CREATE TABLE IF NOT EXISTS `t_response_logs` ( `id` int(11) NOT NULL AUTO_INCREMENT, `result` text NOT NULL, `channel` varchar(20) NOT NULL, `level_name` varchar(20) NOT NULL, `level` smallint(6) NOT NULL, `uid` varchar(32) NOT NULL, `process_id` int(11) NOT NULL, `ip` varchar(32) NOT NULL, `url` varchar(255) NOT NULL, `http_method` varchar(10) NOT NULL, `query_string` varchar(255) NOT NULL, `referrer` varchar(255) NOT NULL, `post` text NOT NULL, `context` text NOT NULL, `extra` text NOT NULL, `created_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; COMMIT;
2、新增好数据表后,我们让系统支持processors和Database Driver
在app.php中,添加provider配置项(最好靠前配置)
Pianzhou\Laravel\Log\LogServiceProvider::class, Pianzhou\Laravel\Log\DatabaseDriverServiceProvider::class,
3、然后,在logging.php配置文件中
'response_log' => [ 'driver' => 'database', 'level' => env('LOG_LEVEL', 'debug'), 'batch' => true, // 'connection' => 'mysql', 'table' => 'response_logs', 'formatter' => Pianzhou\Monolog\Formatter\TransformScalarFormatter::class, 'formatter_with' => [ // 'dateFormat' => 'Y-m-d H:i:s', 'transfroms' => [ 'result' => 'message', 'channel' => 'channel', 'level_name' => 'level_name', 'level' => 'level', 'context' => 'context', 'extra' => 'extra', 'created_at' => 'datetime', 'process_id' => 'extra.process_id', 'uid' => 'extra.uid', 'url' => 'extra.url', 'ip' => 'extra.ip', 'http_method' => 'extra.http_method', 'query_string' => 'extra.query_string', 'referrer' => 'extra.referrer', 'post' => 'extra.post', ] ], 'processors' => [ Monolog\Processor\UidProcessor::class, Monolog\Processor\ProcessIdProcessor::class, Monolog\Processor\WebProcessor::class => [ 'extraFields' => [ 'url' => 'REQUEST_URI', 'ip' => 'REMOTE_ADDR', 'http_method' => 'REQUEST_METHOD', 'server' => 'SERVER_NAME', 'referrer' => 'HTTP_REFERER', 'query_string'=> 'QUERY_STRING', ], ], Pianzhou\Monolog\Processor\PostProcessor::class => [ 'maskFileds' => [ 'password', 'password_confirm', 'data.password', 'data.username.a', ] ] ], ],
4、在app\Http\Middleware目录中,新增ApiLog.php代码如下:
<?php /* * @Description: 响应内容记录器 * @Author: (c) Pian Zhou <pianzhou2021@163.com> * @Date: 2022-01-08 22:26:13 * @LastEditors: Pian Zhou * @LastEditTime: 2022-01-10 23:14:19 */ namespace App\Http\Middleware; use Pianzhou\Laravel\Log\Middleware\ResponseLogMiddleware; class ApiLog extends ResponseLogMiddleware { /** * 日志通道 * * @var string */ protected $channel = 'response_log'; /** * 调试模式是否跳过记录 * * @var boolean */ protected $skipIfDebug = false; /** * 配置中的路径将不会被记录 * * @var array */ protected $except = [ // ]; }
5、新增好Middleware后,我们就可以在app\Http\Kernel.php中配置了
5.1 如果需要全局记录,则在middleware属性中配置:
protected $middleware = [ \App\Http\Middleware\ApiLog::class, ];
5.2 如果只是需要在api,或者web中使用,则配置在middlewareGroups属性中:
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\ApiLog::class, ], 'api' => [ // \App\Http\Middleware\ApiLog::class, ], ];
5.3 如果,我们想在路由中使用则配置在routeMiddleware属性中:
protected $routeMiddleware = [ 'response.log'=> \App\Http\Middleware\ApiLog::class, ];
这样,我们就可以在route中使用,例如:
Route::middleware('response.log')->any('/', function () { return 'test'; }