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

时间:2014-09-21 22:53:15

标签: java logging configuration

我希望我的Logger与FileHandler一起使用我的配置文件中定义的设置。在使用LogManager.readConfiguration(InputStream)之后是否必须使用Logger.getLogger或Logger.addHandler(新的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);

1 个答案:

答案 0 :(得分:2)

与此相关的是: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
  5. 如果您在启动脚本中将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);
    
    1. 如果打印了java.util.logging.SimpleFormatter,那么您知道已经配置了LogManager。
    2. 如果没有打印任何内容,则抛出异常或在属性文件中设置空值。
    3. 如果打印为null,则说明配置文件不正确或重置LogManager。
    4. 这是一个简单的测试,用于证明日志管理器的工作原理。

      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()));
          }
      }