Laravel基于PHP Monolog打造一个API日志记录器

之前的文章中,我们提到了基于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';
}

上一篇:laravel中model查询数据


下一篇:laravel创建数据库和model文件