更新log4j2附加器fileName时出现错误FileManager java.io. IO异常:文件名、目录名或卷标语法不正确

oyt4ldly  于 2022-11-06  发布在  Java
关注(0)|答案(1)|浏览(291)

我有一个log4j2.xml文件,用来定义一些输出到.log文件的记录器。

<?xml version="1.0" encoding="UTF-8" ?>
<Configuration>
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{MM-dd HH:mm:ss  } %p - %m%n"/>
        </Console>

        <File name="LogFileAppender" fileName="${sys:logFileName}" append="false">
            <PatternLayout>
                <Pattern>%d [%t] %p - %m%n</Pattern>
            </PatternLayout>
        </File>
    </Appenders>

    <Loggers>
        <Root level="error">
            <AppenderRef ref="ConsoleAppender" />
            <AppenderRef ref="LogFileAppender"/>

        </Root>
    </Loggers>
</Configuration>

在读入.xml之后,我在java中设置了logger fileNames的完整路径。

public static void initializeLoggers(String logPath)
{
    // set output paths for log files
    System.setProperty("logFileName", logPath + "PROJECT.log");

    // reconfigure loggers with paths
    org.apache.logging.log4j.core.LoggerContext ctx =
            (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
    ctx.reconfigure();
}

代码按预期工作,日志输出到更新的路径,但我遇到以下错误:
2022-01-18 15:05:26,685主要错误文件管理器(${sys:logFileName})java.io. IO异常:文件名、目录名或卷标语法不正确。java.io。IOException:文件名、目录名或卷标语法不正确
2022-01-18 15:05:26,693 main ERROR无法为元素创建类org.apache.logging.log4j.core.appender.FileAppender类型的插件文件:java.lang.IllegalStateException:管理器工厂无法为包含数据的[${sys:logFileName}]创建管理器[文件管理器$FactoryData@61009542] java.lang.非法状态异常:管理器工厂[文件管理器$FileManagerFactory@4d826d77]无法使用数据[文件管理器$FactoryData@61009542]为[${系统:日志文件名}]创建管理器
2022-01-18 15:05:26,699 main ERROR无法为元素调用类org.apache.logging.log4j.core.appender.FileAppender中的工厂方法文件:java.lang.IllegalStateException:找不到用于类的工厂方法。找不到类org.apache.logging.log4j.core.appender.FileAppender的工厂方法
这很奇怪,因为我更新的路径是正确的,并且生成的日志沿着里面的所有信息都输出到了所需的目录中。在initializeLoggers()之前也没有日志记录。如果有任何帮助,我们将不胜感激!I referenced this post for the properties updating solution

wxclj1h5

wxclj1h51#

在用文件名值初始化记录器之前,代码调用了LogManager.getLoggers()。我只是像这样设置了默认值,现在代码运行没有错误:

<File name="LogFileAppender" fileName="${sys:logFileName:-default}" append="false">
    <PatternLayout>
        <Pattern>%d [%t] %p - %m%n</Pattern>
    </PatternLayout>
</File>

相关问题