📅  最后修改于: 2023-12-03 14:43:44.887000             🧑  作者: Mango
在 Laravel 应用程序中执行数据库查询时,可以轻松地启用数据库查询日志以调试和优化查询。但是,查询日志可能会包含敏感信息(例如密码)或无用的信息(例如运行时间),因此我们需要对其进行字符串替换。
在 Laravel 5.6 或更高版本中,我们可以使用 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;
}
}
<?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;
});
}
}
'channels' => [
...
'user_actions' => [
'driver' => 'daily',
'path' => storage_path('logs/user_actions'),
'level' => 'debug',
'days' => 14,
],
...
],
执行 Laravel 数据库查询时,启用数据库查询日志已经成为调试和优化的必要步骤。然而,由于日志文件可能包含敏感信息,因此需要对其进行字符串替换。通过使用 Laravel 的 Log Processor,可以轻松地全局替换查询日志中的敏感数据。