📜  laravel db 查询日志字符串替换 - PHP (1)

📅  最后修改于: 2023-12-03 14:43:44.887000             🧑  作者: Mango

Laravel DB 查询日志字符串替换

在 Laravel 应用程序中执行数据库查询时,可以轻松地启用数据库查询日志以调试和优化查询。但是,查询日志可能会包含敏感信息(例如密码)或无用的信息(例如运行时间),因此我们需要对其进行字符串替换。

方法

在 Laravel 5.6 或更高版本中,我们可以使用 Log Processor 全局转换查询字符串,从而对其进行字符串替换。

  1. 创建一个新的 Log Processor 类并实现 __invoke 方法:
<?php

namespace App\Log;

class QueryLogProcessor
{
    /**
     * 处理查询日志中的消息
     *
     * @param  array  $record
     * @return array
     */
    public function __invoke(array $record)
    {
        if (isset($record['context']['query'])) {
            $record['context']['query'] = $this->replaceSensitiveInfo($record['context']['query']);
        }
        return $record;
    }

    /**
     * 替换查询字符串中的敏感信息
     *
     * @param  string  $query
     * @return string
     */
    private function replaceSensitiveInfo($query)
    {
        $sensitiveWords = ['password', 'secret'];
        foreach ($sensitiveWords as $word) {
            $query = preg_replace('/"' . $word . '":\s*"[^"]+"/i', '"' . $word . '": "***"', $query);
            $query = preg_replace('/\'' . $word . '\':\s*\'[^\']+/i', '\'' . $word . '\': \'***', $query);
        }
        return $query;
    }
}
  1. 通过 Laravel 的服务容器将该 Log Processor 注册为日志处理器:
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Monolog\Processor\ProcessIdProcessor;
use Monolog\Processor\Processors\HostnameProcessor;
use App\Log\QueryLogProcessor;
use Illuminate\Log\LogManager;
use Monolog\Logger;

class LogServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        $this->app->make(LogManager::class)->extend('daily', function ($app, $config) {
            $logger = new Logger($config['name']);
            $logger->pushProcessor(new HostnameProcessor());
            $logger->pushProcessor(new ProcessIdProcessor());
            $logger->pushProcessor(new QueryLogProcessor()); // 注册 QueryLogProcessor
            $logger->pushHandler(new StreamHandler(
                $config['path'] . '/' . $config['name'] . '-' . PHP_SAPI . '.log',
                $config['level'],
                true,
                $config['permission']
            ));
            return $logger;
        });
    }
}
  1. 最后,在配置文件中以相同的名称启用 Log 频道:
'channels' => [
    ...
    'user_actions' => [
        'driver' => 'daily',
        'path' => storage_path('logs/user_actions'),
        'level' => 'debug',
        'days' => 14,
    ],
    ...
],
结论

执行 Laravel 数据库查询时,启用数据库查询日志已经成为调试和优化的必要步骤。然而,由于日志文件可能包含敏感信息,因此需要对其进行字符串替换。通过使用 Laravel 的 Log Processor,可以轻松地全局替换查询日志中的敏感数据。