相关疑难解决方法(0)

可通过log4net进行可配置的敏感数据屏蔽

我正在寻找使用log4net作为我刚刚开始的新项目的首选日志框架.我在原型设计过程中遇到的一个问题是我无法找到明确的答案,那就是如何以可配置和整洁的方式清理或屏蔽消息内容.

假设我想要让几个清洁工采取行动,但我也想遵循单一责任原则.一些清洁的例子:

  • Cardnumber/PAN清洁剂
  • 密码清理
  • 私人数据清理

我知道你永远不应该用纯文本记录这种信息,执行日志的代码永远不会故意这样做.我希望得到最后一级保护,但是如果数据变得格式不正确并且敏感数据以某种方式滑入某个地方则不应该; 日志是最糟糕的情况.

选项1:

我发现这篇StackOverflow文章详细介绍了一种可能的解决方案,但它涉及到反射的使用.这对于性能来说是不可取的,但操作内部存储机制似乎也很麻烦. 编辑-log4net的的消息先于他们到达的最追加程序

选项2:

针对同一问题的建议答案建议使用PatternLayoutConverter.这适用于单个清理器操作,但您无法使用多个操作,如下所示:

public class CardNumberCleanerLayoutConverter : PatternLayoutConverter
{
   protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
   {
      string message = loggingEvent.RenderedMessage;

      // TODO: Replace with real card number detection and masking.
      writer.Write(message.Replace("9", "*"));
   }
}
Run Code Online (Sandbox Code Playgroud)
<layout type="log4net.Layout.PatternLayout">
   <converter>
      <name value="cleanedMessage" />
      <type value="Log4NetPrototype.CardNumberCleanerLayoutConverter, Log4NetPrototype" />
   </converter>
   <converter>
      <name value="cleanedMessage" />
      <type value="Log4NetPrototype.PasswordCleanerLayoutConverter, Log4NetPrototype" />
   </converter>
   <conversionPattern value="%cleanedMessage" />
</layout>
Run Code Online (Sandbox Code Playgroud)

在如上所述的命名冲突的情况下,最后加载的转换器将是被动作的转换器.使用上面的示例,这意味着将清除密码,但不会清除卡号.

选项3:

我尝试过的第三个选项是使用链接的ForwarderAppender实例,但这很快使配置复杂化,我不认为它是一个理想的解决方案.因为LoggingEvent类具有不可变的RenderedMessage属性,所以我们无法在不创建LoggingEvent类的新实例并将其传递的情况下更改它,如下所示:

public class CardNumberCleanerForwarder : ForwardingAppender
{
   protected override void …
Run Code Online (Sandbox Code Playgroud)

.net c# log4net replace

8
推荐指数
1
解决办法
1555
查看次数

Log4Net:如何向每个日志行添加简单的索引器(行号)

这是问题:我想在日志文件中的每一行添加行索引器(行号或迭代器).我不需要它对于整个日志文件是唯一的,但仅适用于"应用程序会话"(即每次启动Win32应用程序时,我们开始倒计时:1,2,3等等)

是内置方式(转换模式标记语法)还是一些自定义扩展?

非常感谢!

.net c# logging log4net

3
推荐指数
1
解决办法
4359
查看次数

标签 统计

.net ×2

c# ×2

log4net ×2

logging ×1

replace ×1