作为任务的一部分,我必须在日志记录期间屏蔽包含密码等的属性的敏感值,并以不更改调用代码的方式进行屏蔽。
例如,在ASP.NET核心项目的客户端中,调用代码如下所示:
ILog logger = LogManager.GetLogger(this.GetType());
RequestDto dto = new RequestDto();
dto.Body = new RequestDtoBody();
dto.Body.pwd = "12345";
// Fill all the necessary properties to make the request...
logger.Debug("Making request: " + JsonConvert.SerializeObject(dto)); //...
属性pwd
的值应替换为***
,但记录器仅接收字符串消息。
1条答案
按热度按时间0x6upsns1#
经过大量的研究和实验,我能够通过扩展LayoutSkeleton并将消息修改为如下形式来提出解决方案:
代码通过检查JSON对象有效所必须匹配的开头和结尾的数量来探测JSON对象。只要记录消息中的当前字符没有构建JSON,就会立即将其写入流中。否则,将使用StringBuilder来保存可能是JSON的字符,并在其完成时,它被临时转换为JObject,JObject又被遍历以屏蔽(替换)或隐藏敏感属性的所有值。
此自定义布局可用于log4net配置如下的情况:
事实上,所有的日志框架都应该支持实现拦截器,就像前面讨论的那样,我希望这能节省一些人的时间。