当我在本地计算机上启动jar文件时,会创建两个日志文件,这两个日志文件由两个记录器在同一目录中配置slf4j。在前一种情况下一切都很好。创建了两个文件。但是当我从计算机上启动这个jar时,通过filemanager(TotalCmd,FAR)在网络驱动器上有java.nio.channels.OverlappingFileLockException。只在网络驱动器上的文件夹中创建了一个第一个文件。
package mypackage;
import java.util.Date;
import java.util.ResourceBundle;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import ru.mycompany.bicomp.app.BaseApp;
import ru.mycompany.db.client.TaskContext;
import ru.mycompany.form.error.JInvErrorService;
import ru.mycompany.jinvecd.impl.ECDAppImpl;
public class ECDApp extends BaseApp {
private static final ResourceBundle resource = ResourceBundle.getBundle("ecd");
private static Logger logger = Logger.getLogger("EcdAppLogger");
@Override
public String getAppID() {
return "XXI.JECD";
}
@Override
protected void initialize(String[] args) {
super.initialize(args); //To change body of generated methods, choose Tools | Templates.
configureLoggerOfApplication();
}
protected String createLoggerFileName() {
return "logs\\" + "ECDAppRootLog." + getAppID() + ".log";
}
private void configureLoggerOfApplication() {
try {
FileHandler fh = new FileHandler(createLoggerFileName(), true);
fh.setFormatter(new SimpleFormatter());
ConsoleHandler ch = new ConsoleHandler();
ch.setFormatter(new SimpleFormatter());
ch.setLevel(Level.ALL);
logger.addHandler(fh);
logger.addHandler(ch);
logger.setLevel(Level.ALL);
logger.info("------------------------Start " + new Date(System.currentTimeMillis()) + "----------------------");
} catch (Throwable ex) {
JInvErrorService.handleException(null, ex);
}
}
}
异常开始从
开始FileHandler fh = new FileHandler(createLoggerFileName(),true);
文件夹日志\已存在,因为它是由第一个记录器的配置
创建的protected String createDefaultLoggerFileName() {
try {
Path p = FileSystems.getDefault().getPath(".", "logs");
Files.createDirectory(p);
//Files.createDirectory((""));
} catch (IOException ex) {
}
return "logs\\" + getAppID() + ".log";
}
/**
*
*/
protected void configureDefaultLogger() throws IOException {
FileHandler fh = new FileHandler(createDefaultLoggerFileName());
fh.setFormatter(new SimpleFormatter());
Logger defaultLogger = Logger.getLogger("ru.mycompany." + getAppID());
defaultLogger.addHandler(fh);
appLog = LoggerFactory.getLogger("ru.mycompany." + getAppID());
logSystemProperties();
}
谢谢!
答案 0 :(得分:1)
在JDK-8031438: FileHandler下提交的此问题会抛出OverlappingFileLockException。尽管未将JDK-8048020的补丁标记为已修复:java.util.logging.FileHandler上的回归应解决此问题。这已在JDK8u40中修复。
FileHandler文档没有声明可以从构造函数中抛出OverlappingFileLockException。阅读FileChannel.tryLock文档,可以通过返回null或抛出OverlappingFileLockException来指示无法获取锁。 FileHandler.openFiles方法似乎不处理抛出OverlappingFileLockException的情况,因为它扩展了IllegalStateException。从FileHandler抛出这一事实表明这是一个错误。
在NIO FileLock文档中说过,“一般来说,在锁定驻留在网络文件系统上的文件时应该非常小心。”因此,即使修复了这个错误,仍然可能无法按照Java API的合同进行操作。