【发布时间】: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 网站后,我找到了这些参考资料。
如果多个 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