【问题标题】:Updating log4j2 appender fileName gives ERROR FileManager java.io.IOException: The filename, directory name, or volume label syntax is incorrect更新 log4j2 appender fileName 给出 ERROR FileManager java.io.IOException: The filename, directory name, or volume label syntax is wrong
【发布时间】:2022-01-18 23:14:59
【问题描述】:

我有一个 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 中设置了记录器文件名的完整路径。

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.IOException:文件名、目录名或卷标 语法不正确 java.io.IOException: 文件名、目录 名称或卷标语法不正确

2022-01-18 15:05:26,693 主要错误无法创建类型的插件 类 org.apache.logging.log4j.core.appender.FileAppender 元素 文件:java.lang.IllegalStateException:ManagerFactory [org.apache.logging.log4j.core.appender.FileManager$FileManagerFactory@4d826d77] 无法使用数据为 [${sys:logFileName}] 创建管理器 [org.apache.logging.log4j.core.appender.FileManager$FactoryData@61009542] java.lang.IllegalStateException:ManagerFactory [org.apache.logging.log4j.core.appender.FileManager$FileManagerFactory@4d826d77] 无法使用数据为 [${sys:logFileName}] 创建管理器 [org.apache.logging.log4j.core.appender.FileManager$FactoryData@61009542]

2022-01-18 15:05:26,699 主要错误无法在类中调用工厂方法 org.apache.logging.log4j.core.appender.FileAppender 元素文件: java.lang.IllegalStateException:找不到类的工厂方法 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

【问题讨论】:

  • 在 initializeLoggers() 之前没有发生日志记录:是的,但您可能会调用 LogManager.getLoggerbefore。您可以通过将-Dlog4j2.loggerContextStacktraceOnStart=true-Dlog4j2.debug=true 设置为JVM 参数来进行检查。
  • 这可能是正在发生的事情,因为我确实在类的顶部定义了 LogManager.getLogger ...有没有办法解决这个问题?在代码中设置之前,我的附加程序是否需要默认文件名值? @PiotrP.Karwasz

标签: java xml log4j log4j2 ioexception


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2023-02-03
    • 2021-05-26
    • 2018-09-30
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多