gpt4 book ai didi

php - 有没有办法集中预处理由 monolog 创建的所有日志?

转载 作者:搜寻专家 更新时间:2023-10-31 21:07:42 24 4
gpt4 key购买 nike

我目前正在开发一个大型应用程序,该应用程序使用 monolog 进行日志记录,并被要求隐藏任何敏感信息,例如密码。

我尝试做的是扩展 monolog,这样它会自动用星号替换敏感信息,但即使数据似乎被更改,最终还是记录了原始文本。

use Monolog\Handler\AbstractProcessingHandler;

class FilterOutputHandler extends AbstractProcessingHandler
{
private $filteredFields = [];

public function __construct(array $filteredFields = [], $level = Monolog\Logger::DEBUG, $bubble = true)
{
$this->filteredFields = array_merge($filteredFields, $this->filteredFields);
parent::__construct($level, $bubble);
}

protected function write(array $record)
{
foreach($record['context'] as $key=>$value){
if(in_array($key, $this->filteredFields)){
$record['context'][$key] = '*****';
}
}

return $record;
}

}

当我初始化记录器时,我会这样做:

 $logger->pushHandler(new FilterOutputHandler(['username', 'password']));
$logger->debug('Sensitive data incoming', ['username'=> 'Oh noes!', 'password'=> 'You shouldn\'t be able to see me!']);

我还尝试覆盖 AbstractProcessingHandler 接口(interface)的 handleprocessRecord 方法,但没有成功。这可以在独白中完成吗?

最佳答案

看来我试错了。

我不得不使用 pushProcessor(callable) 方法添加一个新的处理器,而不是向我的记录器添加一个新的处理程序。

因此,在我的特定用例中,我可以像这样向我的上下文添加过滤器:

function AddLoggerFilteringFor(array $filters){
return function ($record) use($filters){
foreach($filters as $filter){
if(isset($record['context'][$filter])){
$record['context'][$filter] = '**HIDDEN FROM LOG**';
}
}
return $record;
};
}

稍后我可以简单地添加过滤器

(init)
$logger->pushProcessor(AddLoggerFilteringFor(['username', 'password']));

...
(several function definition and business logic later)
$logger->debug('Some weird thing happened, better log it', ['username'=> 'Oh noes!', 'password'=> 'You shouldn\'t be able to see me!']);

关于php - 有没有办法集中预处理由 monolog 创建的所有日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29679390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com