我目前正在开发一个使用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!']);
我还尝试覆盖handle
界面的processRecord
和AbstractProcessingHandler
方法但是徒劳无功。这可以在monolog中完成吗?
答案 0 :(得分:2)
看起来我正在尝试错误的事情。
我不得不在记录器中添加新处理程序,而是使用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!']);