2016-04-29 73 views
5

我正在使用log4j2(version-2.5),我正在尝试编写一个消息转换器插件,它将屏蔽一些日志消息的已知模式。如何屏蔽log4j2日志消息

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

当我运行我用这个插件的Web应用程序,然后我看到这个警告讯息

WARN转换键“M”已被映射到“类 org.apache.logging.log4j.core .pattern.MessagePatternConverter”。对不起, 戴夫,我不能让你这样做!忽略插件[类 MyCustomFilteringLayout]。

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

Reference

如果多个转换器指定相同ConverterKeys,则上面的负载 顺序决定哪一个将被使用。例如,要 覆盖由内置的 DatePatternConverter类提供的%日期转换器,您需要将插件放置在LOG4j-core.jar之前的CLASSPATH中的 JAR文件中。这不是建议的 ;模式ConverterKeys碰撞将导致警告 被发射。尝试使用独特的ConverterKeys为您的自定义模式 转换器。

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

附加信息: 我已经为MyCustomFilteringLayout创建了阴影罐。我这样做的原因是我想让屏蔽逻辑与应用程序分开。


更新

我创建转换为自己的钥匙,看起来像这样,

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

在这里我不能再写转换器相同ConverterKeys - 厘米? 现在我log4j2.xml具有这种模式布局,

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

只是想知道,你能简单地使用另一个没有被现有转换器采用的密钥,并相应地改变你的日志模式吗? –

+0

如果我这样做,那么我不会为我的密钥写多个转换器,我认为这不会解决我的使用案例。我的使用案例是,我想掩盖日志消息中的某些模式,我在想的是为不同场景创建多个转换器。我做错了吗?有没有更好的方法来做到这一点? – Shishir

+0

我假设你想屏蔽日志事件中的数据,而不是阻止使用某些转换器密钥?为什么不使用不同的转换器密钥来编写自己的转换器呢?我不太了解你的陈述,你将无法编写多个转换器。也许你需要更好地解释你想达到的目标。 – rgoers

回答

3

你更新解决了这个问题和答案的问题如何与一个自定义更换内置的消息变换。它需要一个独特的密钥。

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

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

+0

这个有用? –

+0

感谢您的回复。这很有帮助。 – Shishir