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
标签:
log4j2 log4j
, PluginFactory
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了