【问题标题】:OverlappingFileLockException while logging记录时出现 OverlappingFileLockException
【发布时间】:2013-12-17 10:37:44
【问题描述】:

当我在本地机器上启动 jar 文件时,会在同一目录中创建由两个配置 slf4j 的记录器写入的两个日志文件。在前一种情况下一切正常。创建了两个文件。但是当我通过网络驱动器上的文件管理器(TotalCmd,FAR)从我的计算机启动这个 jar 时,会出现 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();
}

谢谢!

【问题讨论】:

  • 其实连问题都没有。

标签: java exception logging


【解决方案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 的合同尝试执行此操作。

【讨论】:

    猜你喜欢
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2019-09-14
    • 2019-02-28
    • 2018-06-17
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多