Java 如何修复在org.apache.logging.log4j.core.appender.RollingFileAppender类中无法调用元素RollingFile的工厂方法?

Java 如何修复在org.apache.logging.log4j.core.appender.RollingFileAppender类中无法调用元素RollingFile的工厂方法?,java,spring,spring-boot,log4j,log4j2,Java,Spring,Spring Boot,Log4j,Log4j2,我正在使用SpringBoot(2.2.0.RELEASE)配置log4j2。在tomcat中部署war时遇到一些运行时异常。我设置了系统属性(日志名称),然后设置了log4j属性中提到的名称 public class Main extends SpringBootServletInitializer { static { String currentpath = ""; String logAppContext = ""; if (Thr

我正在使用SpringBoot(2.2.0.RELEASE)配置log4j2。在tomcat中部署war时遇到一些运行时异常。我设置了系统属性(日志名称),然后设置了log4j属性中提到的名称

public class Main extends SpringBootServletInitializer {
    static {
        String currentpath = "";
        String logAppContext = "";
        if (Thread.currentThread().getContextClassLoader().getResource("") != null) {
            currentpath = Thread.currentThread().getContextClassLoader().getResource("").toString().replace("%23", "#")
                    .replace("file:/", "");
            logAppContext = currentpath.isEmpty() ? logAppContext
                    : Paths.get(currentpath).getParent().getParent().getFileName().toString();
            System.setProperty("finlog", logAppContext);
            System.setProperty("context", logAppContext);
        }
    }

    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Main.class);
    }
}
运行时错误:

ERROR Unable to invoke factory method in class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile: java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Properties>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd'@'HH:mm:ss}|[%t]|[AM]|%p|%X{Slf4jMDCFilter.UUID}|%c{1}()
            %M(%L) %m%n</Property>
        <Property name="APP_LOG_ROOT"
            value="logs/${sys:finlog}">
        </Property>
    </Properties>
    <Appenders>
        <RollingFile name="errorlog"
            fileName="${APP_LOG_ROOT}/error.log"
            filePattern="${APP_LOG_ROOT}/ErrorLog-%d{yyyy-MM-dd}-%i.log">
            <LevelRangeFilter minLevel="ERROR" maxLevel="ERROR"
                onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="${LOG_PATTERN}" />
            <Policies>
                <SizeBasedTriggeringPolicy size="19500KB" />
            </Policies>
        </RollingFile>
        <RollingFile name="debugLog"
            fileName="${APP_LOG_ROOT}/debug.log"
            filePattern="${APP_LOG_ROOT}/DebugLog-%d{yyyy-MM-dd}-%i.log">
            <LevelRangeFilter minLevel="DEBUG" maxLevel="DEBUG"
                onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="${LOG_PATTERN}" />
            <Policies>
                <SizeBasedTriggeringPolicy size="19500KB" />
            </Policies>
        </RollingFile>

        <RollingFile name="infoLog"
            fileName="${APP_LOG_ROOT}/info.log"
            filePattern="${APP_LOG_ROOT}/InfoLog-%d{yyyy-MM-dd}-%i.log">
            <LevelRangeFilter minLevel="INFO" maxLevel="INFO"
                onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="${LOG_PATTERN}" />
            <Policies>
                <SizeBasedTriggeringPolicy size="19500KB" />
            </Policies>
        </RollingFile>

        <RollingFile name="warnLog"
            fileName="${APP_LOG_ROOT}/warn.log"
            filePattern="${APP_LOG_ROOT}/WarnLog-%d{yyyy-MM-dd}-%i.log">
            <LevelRangeFilter minLevel="WARN" maxLevel="WARN"
                onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="${LOG_PATTERN}" />
            <Policies>
                <SizeBasedTriggeringPolicy size="19500KB" />
            </Policies>
            <DefaultRolloverStrategy max="10" />
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="com.demo.engine" additivity="false"
            level="debug">
            <AppenderRef ref="errorlog" />
            <AppenderRef ref="debugLog" />
            <AppenderRef ref="infoLog" />
            <AppenderRef ref="warnLog" />
        </Logger>
        <Logger name="org.springframework" additivity="false"
            level="error">
            <AppenderRef ref="springLog" />
            <AppenderRef ref="console" />
        </Logger>
        <Root level="DEBUG">        
        </Root>
    </Loggers>
</Configuration>
Log4j.xml:

ERROR Unable to invoke factory method in class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile: java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Properties>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd'@'HH:mm:ss}|[%t]|[AM]|%p|%X{Slf4jMDCFilter.UUID}|%c{1}()
            %M(%L) %m%n</Property>
        <Property name="APP_LOG_ROOT"
            value="logs/${sys:finlog}">
        </Property>
    </Properties>
    <Appenders>
        <RollingFile name="errorlog"
            fileName="${APP_LOG_ROOT}/error.log"
            filePattern="${APP_LOG_ROOT}/ErrorLog-%d{yyyy-MM-dd}-%i.log">
            <LevelRangeFilter minLevel="ERROR" maxLevel="ERROR"
                onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="${LOG_PATTERN}" />
            <Policies>
                <SizeBasedTriggeringPolicy size="19500KB" />
            </Policies>
        </RollingFile>
        <RollingFile name="debugLog"
            fileName="${APP_LOG_ROOT}/debug.log"
            filePattern="${APP_LOG_ROOT}/DebugLog-%d{yyyy-MM-dd}-%i.log">
            <LevelRangeFilter minLevel="DEBUG" maxLevel="DEBUG"
                onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="${LOG_PATTERN}" />
            <Policies>
                <SizeBasedTriggeringPolicy size="19500KB" />
            </Policies>
        </RollingFile>

        <RollingFile name="infoLog"
            fileName="${APP_LOG_ROOT}/info.log"
            filePattern="${APP_LOG_ROOT}/InfoLog-%d{yyyy-MM-dd}-%i.log">
            <LevelRangeFilter minLevel="INFO" maxLevel="INFO"
                onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="${LOG_PATTERN}" />
            <Policies>
                <SizeBasedTriggeringPolicy size="19500KB" />
            </Policies>
        </RollingFile>

        <RollingFile name="warnLog"
            fileName="${APP_LOG_ROOT}/warn.log"
            filePattern="${APP_LOG_ROOT}/WarnLog-%d{yyyy-MM-dd}-%i.log">
            <LevelRangeFilter minLevel="WARN" maxLevel="WARN"
                onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="${LOG_PATTERN}" />
            <Policies>
                <SizeBasedTriggeringPolicy size="19500KB" />
            </Policies>
            <DefaultRolloverStrategy max="10" />
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="com.demo.engine" additivity="false"
            level="debug">
            <AppenderRef ref="errorlog" />
            <AppenderRef ref="debugLog" />
            <AppenderRef ref="infoLog" />
            <AppenderRef ref="warnLog" />
        </Logger>
        <Logger name="org.springframework" additivity="false"
            level="error">
            <AppenderRef ref="springLog" />
            <AppenderRef ref="console" />
        </Logger>
        <Root level="DEBUG">        
        </Root>
    </Loggers>
</Configuration>

在我的情况下,这是一个权限问题,文件路径被记录到。更改权限为我修复了它

面临同样的问题,但这不是问题的答案,尽管有人可能会觉得这很有帮助

在我的例子中,这是空系统属性变量的问题。 我的日志配置文件使用了主类中设置的一些系统属性变量,这是由于xml中的属性名称拼写错误而导致的错误

系统属性:
hostAddress

System.setProperty("hostAddress", InetAddress.getLocalHost().getHostAddress().replaceAll("\\.", "_"));
${log-file-path}/auth-demo-app-${sys:hostAdddress}-${date:yyyy-MM-dd}.log
配置文件中拼写错误为:
hostaddress

System.setProperty("hostAddress", InetAddress.getLocalHost().getHostAddress().replaceAll("\\.", "_"));
${log-file-path}/auth-demo-app-${sys:hostAdddress}-${date:yyyy-MM-dd}.log

更正此问题解决了问题。

能否将配置元素上的status=“INFO”更改为status=“DEBUG”,并将其输出添加到问题中?@rgoers我已将status INFO更改为DEBUG,但仍然相同!您是否将生成的调试输出添加到问题中?我需要看到这一点来确定发生了什么。仅仅启用调试并不能解决问题。