可以使用logmanger.reset()禁用java0.log文件和.lck文件的创建,但我想基于某些配置参数执行此操作

时间:2017-04-04 11:21:42

标签: java java.util.logging

Java创建日志文件java0.log并锁定/root文件夹

中的文件

可以使用LogManager.reset()函数禁用此行为,但我想根据某些配置参数调用此函数。

任何人都可以建议我可以使用哪个配置文件来执行此操作以及如何实现此目的?

1 个答案:

答案 0 :(得分:0)

使用java.util.logging.config.file系统属性并将其指向NUL device

在Windows上:

-Djava.util.logging.config.file=NUL

在Linux上:

-Djava.util.logging.config.file=/dev/null

在任何平台上,您只需创建一个空文件并指向它即可。

这样做是在启动时使用给定的文件路径(流)调用LogManager.readConfiguration()。根据合同,这种方法将:

  

重新初始化日志记录属性并重新读取日志记录配置

当它读取日志记录配置时,没有要读取的新数据。因此,这就好像它只是在启动时调用LogManager.reset()

如果您希望在根记录器上有更多选择性行为,那么您可以编写自定义类并使用java.util.logging.config.class属性:

package foo.bar;

import java.io.FileInputStream;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public final class LogConfig {

    public LogConfig() throws Throwable {
        //Load the default config file.
        String file = System.getProperty("java.util.logging.config.file");
        if (file != null) {
            LogManager.getLogManager().readConfiguration(new FileInputStream(file));
        }

        //Modify the logger tree if property is set.
        String key = "some.config.property";
        String v = System.getProperty(key);
        if (v == null) {
            throw new NullPointerException("System property '"
                    + key + "' was not defined");
        }

        if (Boolean.parseBoolean(v)) {
            Logger root = Logger.getLogger("");
            for (Handler h : root.getHandlers()) {
                if (h instanceof FileHandler) {
                    root.removeHandler(h);
                    h.close();
                }
            }
        }
    }
}

要使用此类,请设置以下命令行属性:

-Djava.util.logging.config.file=/path/to/file -Djava.util.logging.config.class=foo.bar.LogConfig -Dsome.config.property=true