gpt4 book ai didi

java - 如何让 Logger 使用 LogManager.readConfigurations 中的配置?

转载 作者:行者123 更新时间:2023-11-30 03:45:03 29 4
gpt4 key购买 nike

我希望带有 FileHandler 的记录器使用配置文件中定义的设置。使用 LogManager.readConfiguration(InputStream) 后是否必须使用 Logger.getLogger 或 Logger.addHandler(new FileHandler()) 还是还有更多内容?换句话说,我应该按照什么顺序执行以下三件事(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 将返回的内容。如果您在属性文件中定义了处理程序,则以后无需添加该处理程序。如果您想使用代码添加处理程序,那么您正在寻找的解决方案是:

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

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

-Djava.util.logging.config.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);
  1. 如果打印了 java.util.logging.SimpleFormatter,那么您就知道您已经配置了 LogManager。
  2. 如果没有打印任何内容,则抛出异常或者您在属性文件中设置了空值。
  3. 如果打印 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com