【发布时间】: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