关闭日志文件

问题描述 投票:0回答:3

这个项目是交给我的,所以我不太了解。有一种方法使用日志(java.util.logging.Logger)并创建两个日志文件:

第一个文件:fileName.log

第二个文件:fileName.log.lck

在 Linux 中,当我执行

lsof
时,我看到这两个文件处于打开状态。如何关闭这两个文件?

我想要关闭这些文件的原因是此方法每天运行多次,几周后打开的文件数量达到限制(大约 1000 个),此时我们的系统将停止工作。当我们重新启动进程(执行日志记录的“作业控制器”)时,打开的日志文件数将变为 0,并且它会再次工作。

这就是记录日志的方法

private static Logger log = Logger.getLogger(MyClass.class.getPackage().getName());
try{
    log.logp(Level.SEVERE, "com.MyClass", "run", "It failed");
}

这就是我尝试关闭finally块中的文件的方法,但它不起作用

finally{
    Handler[] handler =   log.getHandlers();
    for(Handler h: handler){
        h.close();
    }
}
java linux logging java.util.logging
3个回答
9
投票

我只是使用:

LogManager.getLogManager().reset();

这将取消您的所有日志设置(日志文件路径、文件名模式、格式化程序...),但它将停止使用记录器关闭锁定文件并释放记录器


2
投票

第一个解决方案

如果您不想修改代码,请使用:How to send java.util.logging to log4j? java.util.logging.Logger 使用 SLF4J 进行 Logback?

我使用log4jlogback。两者都有滚动文件附加器(旧文件被删除)或日期/时间文件附加器。

第二种解决方案

对于日志记录,最好的用法是滚动文件。

String filePattern = " fileName%.log";
int limit = 1000 * 1000; // 1 Mb
int numLogFiles = 3;
FileHandler fh = new FileHandler(filePattern, limit, numLogFiles);

// Add to logger
Logger logger = Logger.getLogger(MyClass.class.getPackage().getName());
logger.addHandler(fh);

我不知道你是否可以添加全局文件处理程序。


0
投票

我自己留在这里:

public class JQLogger {

    public static Logger getLogger(String logName) {
        if (LogManager.getLogManager().getLogger(logName) != null
                && LogManager.getLogManager().getLogger(logName).getHandlers().length > 0)
            return LogManager.getLogManager().getLogger(logName);

        String logPath = "log/";
        if (Files.notExists(Paths.get(logPath)))
            try {
                Files.createDirectories(Paths.get(logPath));
            } catch (IOException e) {
                e.printStackTrace();
            }
        Logger logger = Logger.getLogger(logName);
        logger.setLevel(Level.INFO);
        logger.setUseParentHandlers(false);

        ConsoleHandler consoleHandler = new ConsoleHandler();
        FileHandler fileHandler;
        try {
            fileHandler = new FileHandler(logPath + logger.getName() + ".%g.log", 52428800, 3, true);
            fileHandler.setFormatter(JQLogger.getFormatter());
            logger.addHandler(fileHandler);
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        consoleHandler.setFormatter(JQLogger.getFormatter());
        logger.addHandler(consoleHandler);

        return logger;
    }

    private static Formatter getFormatter() {
        return new SimpleFormatter() {
            private String format = "[%1$tF %1$tT.%1$tL] [%2$-7s] %3$s %n";

            @Override
            public synchronized String format(LogRecord lr) {
                return String.format(format, new Date(lr.getMillis()), lr.getLevel().getLocalizedName(),
                        lr.getMessage());
            }
        };
    }

    public static void closeLogger(Logger logger) {
        for (Handler h : logger.getHandlers()) {
            h.close();
            logger.removeHandler(h);
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.