我希望带有FileHandler的Logger使用我的配置文件中定义的设置。使用LogManager.readConfiguration(InputStream)后是否必须使用Logger.getLogger或Logger.addHandler(new FileHandler())还是还有其他用途?换句话说,假设我必须执行以下3项操作(getLogger,addHandler,readConfigurations),那么应该执行什么顺序呢?

我找不到很多这样的示例,而我发现的示例在Logger.getLogger之后具有LogManager.readConfiguration,但这似乎不起作用。

这是配置文件:

handlers = java.util.logging.FileHandler

.level = ALL

# Default
java.util.logging.FileHandler.limit = 10000000
java.util.logging.FileHandler.count = 10
java.util.logging.FileHandler.append = true
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.level = FINE


编辑:这是与配置有关的代码部分。

String configFilename = "C:\\Users\\dalawh\\Documents\\config.properties";
LogManager manager = LogManager.getLogManager();
String property = manager.getProperty(this.getClass().getPackage().getName()); //DEBUGGING
LogManager.getLogManager().readConfiguration(new FileInputStream(configFilename));
String property2 = manager.getProperty(this.getClass().getPackage().getName()); //DEBUGGING

Logger logger = java.util.logging.Logger.getLogger(this.getClass().getPackage().getName());
String property3 = manager.getProperty(this.getClass().getPackage().getName()); //DEBUGGING
String filename = "C:\\Users\\dalawh\\Documents\\log.log";
this.fileHandler = new FileHandler(filename);
this.logger.addHandler(this.fileHandler);

最佳答案

与此相关的是:configure Logger via global config file

调用LogManager.readConfiguration将确定将返回什么logger.getLogger。如果在属性文件中定义处理程序,则以后不必添加处理程序。
如果要使用代码添加处理程序,那么您正在寻找的解决方案是:


LogManager.readConfiguration
Logger.getLogger和store a strong reference to it
创建新的处理程序
Logger.addHandler


如果在启动脚本中将java.util.logging.config.file定义为系统属性,则无需编写任何代码。

-Djava.util.logging.config.file="path to file"

有关更多信息,请阅读LogManager类级别的文档。

如果无法在启动时定义该属性,则可以使用LogManager.readConfiguration(InputStream)方法执行设置。除非您遇到JDK-8033661 readConfiguration does not cleanly reinitialize the logging system
JDK-5035854 LogManager.readConfiguration does not properly modify existing loggers

如果这些选项都不起作用,则可以求助于记录器并根据需要调用配置方法。

要解决您的问题,请添加以下内容:

String configFilename = "C:\\Users\\dalawh\\Documents\\config.properties";
System.out.println(new File(configFilename).length());
LogManager manager = LogManager.getLogManager();
LogManager.getLogManager().readConfiguration(new FileInputStream(configFilename));
String property = manager.getProperty("java.util.logging.FileHandler.formatter"); //DEBUGGING
System.out.println(property);



如果打印了java.util.logging.SimpleFormatter,则说明您已经配置了LogManager。
如果未打印任何内容,则引发异常,或者您在属性文件中设置了空值。
如果输出null,则说明您的配置文件不正确,或者重置了LogManager。


这是一个简单的测试,以证明日志管理器正常工作。

public class LogManagerTest {

    public static void main(String[] arg) throws IOException {
        read(LogManager.getLogManager(), create());
        FileHandler h = new FileHandler();
        h.close();
        System.out.println(h.getFormatter());
    }

    private static Properties create() {
        Properties props = new Properties();
        props.setProperty("java.util.logging.FileHandler.formatter",
                "java.util.logging.SimpleFormatter");
        return props;
    }

    private static void read(LogManager manager, Properties props) throws IOException {
        final ByteArrayOutputStream out = new ByteArrayOutputStream(512);
        props.store(out, "No comment");
        manager.readConfiguration(new ByteArrayInputStream(out.toByteArray()));
    }
}

关于java - 如何使Logger使用LogManager.readConfigurations中的配置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25964698/

10-10 22:35