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关键字,导致无法初始化。

代码报错位置:

 

posted on 2021-04-22 22:29  le.li  阅读(1921)  评论(0编辑  收藏  举报