public class SelfLogger {
private static Logger logger;
static {
// 对log4j的配置文件进行输出路径的写操作
UserFile.setLogFilePath();
// 返回logger对象
logger = LogManager.getLogger(SelfLogger.class);
}
public static Logger getLogger() {
return logger;
}
}
配置文件的写操作代码
public static void setLogFilePath() {
// 将根目录中的\ 替换成\\
String rootPath = PathUtil.ROOT_PATH;
String outPath = PathUtil.OUT_PATH;
outPath = outPath.replace("\\","\\\\");
rootPath = rootPath.replace("\\", "\\\\");
BufferedWriter writer = null;
try {
String filePath = rootPath + File.separator + File.separator + "src"
+ File.separator + File.separator + "log4j.properties";
if (contextIsExists(filePath)) {
// 如果配置文件中已经包含了输出文件路径,则直接返回。
return;
}
writer = new BufferedWriter(new FileWriter(filePath, true));
writer.newLine();
writer.write("log4j.appender.E.File=" + outPath + File.separator + File.separator + "logs.log");
writer.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我的log4j的appender是使用apache的FileAppender
我想使用一个方法来对配置文件中日志文件的输出路径进行设置
我遇到的问题是:在第一次的单元测试中,总是先出现以下错误提示
log4j:WARN File option not set for appender [E].
log4j:WARN Are you using FileAppender instead of ConsoleAppender?
log4j:ERROR Either File or DatePattern options are not set for appender [E].
log4j:ERROR No output stream or file set for the appender named [E].
然后对配置文件的写操作才完成
总的来说就是对配置文件的写操作是最后完成的,导致获取loger时读取配置文件时写操作还没完成,导致出现错误
我以为是指令重排序造成的,但我使用了synchronized的关键字也没有解决问题(我我我的想法是利用set方法动态的对配置文件中的日志输出路径进行设置)
请问以下各位大佬我这是哪里出现了问题?