【问题标题】:How to mask log4j2 log messages如何屏蔽 log4j2 日志消息
【发布时间】:2016-04-29 03:05:51
【问题描述】:

我正在使用 log4j2(版本 - 2.5)并且我正在尝试编写一个消息转换器插件,它将掩盖日志消息的一些已知模式。

@Plugin(name = "CustomeMasking",
        category = "Converter")
@ConverterKeys({"m"})
public class MyCustomFilteringLayout extends LogEventPatternConverter {
}

当我使用这个插件运行我的网络应用程序时,我会看到这条警告消息

WARN 转换器键 'm' 已经映射到 'class org.apache.logging.log4j.core.pattern.MessagePatternConverter'。对不起, 戴夫,我不能让你那样做!忽略插件[类 MyCustomFilteringLayout]。

在浏览 log4j2 网站后,我找到了这些参考资料。

Reference

如果多个 Converters 指定相同的 ConverterKeys,则加载 上面的顺序决定了使用哪一个。例如,要 覆盖内置的 %date 转换器 DatePatternConverter 类,您需要将插件放在 JAR 文件位于 log4j-core.jar 之前的 CLASSPATH 中。这不是 受到推崇的;模式 ConverterKeys 冲突将导致警告 被发射。尝试为您的自定义模式使用独特的 ConverterKeys 转换器。

我需要帮助来了解如何为 m/msg 编写自定义转换器。有没有更好的办法?

其他详情: 我为 MyCustomFilteringLayout 创建了阴影 jar。我这样做的原因是我想将屏蔽逻辑与应用程序分开。


更新

我为自己的密钥创建了转换器,如下所示,

@Plugin(name = "CustomeMasking",
            category = "Converter")
    @ConverterKeys({"cm"})
    public class MyCustomFilteringLayout extends LogEventPatternConverter {
    }

在这里我不能为相同的 ConverterKeys - cm 编写另一个转换器? 现在我的 log4j2.xml 有了这个模式布局,

<PatternLayout>
                <Pattern>%d %p %c{1.} [%t] %cm %ex%n</Pattern>
            </PatternLayout> 

【问题讨论】:

  • 只是想知道,您能否简单地使用现有转换器未使用的另一个密钥,并相应地更改您的日志模式?
  • 如果我这样做,那么我将无法为我的密钥编写多个转换器,我认为这不会解决我的用例。我的用例是,我想从日志消息中屏蔽某些模式,我想为不同的场景创建许多转换器。我做错了吗?有没有更好的办法?
  • 我假设您想屏蔽日志事件中的数据,而不是阻止使用某些转换器键?为什么不使用不同的转换器密钥编写自己的转换器?我真的不明白你说你不能写多个转换器的说法。也许您需要更好地解释您想要实现的目标。
  • @rgoers,感谢您的回复。我已经更新了我的问题。我想为同一个键编写多个转换器,例如键-“cm”。在我的 log4j2.xml 文件中,我使用此键定义了模式布局, %d %p %c{1.} [%t] %cm %ex%n

标签: java logging log4j log4j2


【解决方案1】:

您的更新解决了问题并回答了如何用自定义消息转换器替换内置消息转换器的问题。它需要一个唯一的密钥。

听起来你想参数化你的模式。许多模式采用options 参数。您可以使用它来控制行为,因此在布局模式中指定 %cm{key1} 将产生与 %cm{key2} 不同的结果。

有关带参数的转换器示例,请参见MdcPatternConverter 的源代码。

【讨论】:

  • 感谢您的回复。很有帮助。
猜你喜欢
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多