1.1 实现RewritePolicy接口
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.appender.rewrite.RewritePolicy; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.PluginFactory; import org.apache.logging.log4j.status.StatusLogger; @Plugin(name = "InjectMarkerPolicy", category = "Core", elementType = "rewritePolicy", printObject = true) public class MyRewritePolicy implements RewritePolicy { /** * 获取日志接口备用 */ Logger logger = StatusLogger.getLogger(); @PluginFactory public static MyRewritePolicy createAppender() { return new MyRewritePolicy(); } @Override public LogEvent rewrite(final LogEvent event) { String msg = event.getMessage().getFormattedMessage(); // 将内容进行脱敏处理,如替换 String dealMsg = msg.replaceAll("\r|\n", ""); // ... return event; } }
log4j.xml部分配置:
<configuration monitorInterval="5" packages="com.xxx.log"> <console name="Console" target="SYSTEM_OUT"> <!--输出日志的格式--> <PatternLayout pattern="xxx" disableAnsi="false" noConsoleNoAnsi="false"/> </console> <Rewrite name="Rewrite_Console"> <InjectMarkerPolicy /> <AppenderRef ref="Console"/> </Rewrite> <root level="info"> <appender-ref ref="Rewrite_Console"/> </root> </loggers>
2、如果自定义类实现的话,直接拷贝RewritePolicy同一jar里的org.apache.logging.log4j.core.appender.rewrite.RewriteAppender,注意修改@Plugin(name = "Rewrite"...)
1.3 记录一个报错信息,启动时无法初始化MyRewritePolicy:
2021-04-22 22:01:44,312 main ERROR Unable to invoke factory method in class com.xxx.log.MyRewritePolicy for element InjectMarkerPolicy: java.lang.IllegalStateException: No factory method found for class com.xxx.log.MyRewritePolicy java.lang.IllegalStateException: No factory method found for class com.xxx.log.MyRewritePolicy
at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.findFactoryMethod(PluginBuilder.java:234)
at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:134)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:1002)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:942)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:934)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:934)
at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:552)
at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:241)
at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:288)
at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:618)
at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:691)
at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:708)
at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:263)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:153)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
at org.apache.commons.logging.LogAdapter$Log4jLog.<clinit>(LogAdapter.java:155)
at org.apache.commons.logging.LogAdapter$Log4jAdapter.createLog(LogAdapter.java:122)
at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:89)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:59)
at org.springframework.boot.SpringApplication.<clinit>(SpringApplication.java:203)
at com.xxx.MyApplication.main(MyApplication.java:15)
分析: 所有@Plugin对应的都需要创建一个factory实例,通过添加@PluginFactory创建一个新对象,可能存在情况:
1、没有创建PluginFactory实例,导致无法初始化
2、创建的实例没有添加static关键字,导致无法初始化。
代码报错位置:
le.li