Java Logger - 配置更改未反映在运行时上

时间:2014-01-14 00:19:40

标签: java logging java.util.logging

我有2个用于记录的配置文件, config1.properties和 config2.properties

当我加载config1.properties并记录某些内容时,格式是正确的,但是当我加载第二个配置文件时,不会反映更改。这是我的代码:

System.setProperty("java.util.logging.config.file", "config1.properties");
logger = Logger.getLogger(this.getClass().getSimpleName());
logger.info("Message 1");
System.setProperty("java.util.logging.config.file", "config2.properties");
LogManager logManager = LogManager.getLogManager();
logManager.readConfiguration();
logger = Logger.getLogger("NewLogger");
logger.info("Message 2");

我已在config2.properties中设置配置,以2行记录消息,但消息仍显示在一行中。

为什么新配置没有生效?我确信我的配置文件是正确的,因为我尝试在config1之前加载config2,并且显示我的记录消息分为2行。

以下是记录的结果:

[01-13-2014 16:48:56:186] LoggerUnitTest INFO: Message 1
[01-13-2014 16:48:56:195] LoggerUnitTest INFO: Message 2

它应该显示为:

[01-13-2014 16:48:56:186] LoggerUnitTest INFO: Message 1
[01-13-2014 16:48:56:195] LoggerUnitTest INFO: 

消息2

以下是我正在使用的配置文件:

config1.properties

handlers=java.util.logging.ConsoleHandler

.level= FINE

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.formatter.format = [%1$tm-%1$td-%1$tY %1$tk:%1$tM:%1$tS:%1$tL] %4$s: %5$s%6$s%n

config2.properties

handlers=java.util.logging.ConsoleHandler

.level= FINE

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
# Note that this line is different from the line in config1
java.util.logging.ConsoleHandler.formatter.format = [%1$tm-%1$td-%1$tY %1$tk:%1$tM:%1$tS:%1$tL] %n %4$s: %5$s%6$s%n

2 个答案:

答案 0 :(得分:3)

这对我有用:

Test.java

import java.util.logging.LogManager;
import java.util.logging.Logger;

public class Test {
  public static void main(String[] args) throws Exception {
    System.setProperty("java.util.logging.config.file", "config1.properties");
    Logger logger = Logger.getLogger(Test.class.getSimpleName());
    logger.info("Message 1");
    System.setProperty("java.util.logging.config.file", "config2.properties");
    LogManager logManager = LogManager.getLogManager();
    logManager.readConfiguration();
    logger = Logger.getLogger(Test.class.getSimpleName());
    logger.info("Message 2");
  }
}

config1.properties

handlers=java.util.logging.ConsoleHandler

.level= FINE

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

config2.properties

handlers=java.util.logging.ConsoleHandler

.level= FINE

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.XMLFormatter

javac Test.java
java Test

Jan 13, 2014 8:51:20 PM Test main
INFO: Message 1
<?xml version="1.0" encoding="windows-1252" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2014-01-13T20:51:20</date>
  <millis>1389664280170</millis>
  <sequence>1</sequence>
  <logger>Test</logger>
  <level>INFO</level>
  <class>Test</class>
  <method>main</method>
  <thread>10</thread>
  <message>Message 2</message>
</record>

答案 1 :(得分:1)

查看Logger.getLogger(String name)documentation

的文档

它说

  

如果创建了新的记录器,将根据其配置其日志级别   LogManager配置,它将配置为也发送   将输出记录到其父级处理程序。它将在。中注册   LogManager全局命名空间。

因此,即使设置了新的配置属性,您的记录器实例也具有旧配置

尝试通过再次调用以下行来获取新实例

logger = Logger.getLogger("new Name");

可能您可能需要以不同方式更改输入参数名称。或者它将返回旧的记录器对象

修改

这里是我试过的示例代码

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class LoggingTest {

    public static void main(String[] args) {
        System.setProperty("java.util.logging.config.file", "config1.properties");
        Logger logger = Logger.getLogger(LoggingTest.class.getSimpleName());
        logger.info("Message 1");
        System.setProperty("java.util.logging.config.file", "config2.properties");
        LogManager logManager = LogManager.getLogManager();
        try {
            logManager.readConfiguration();//logManager.readConfiguration(new FileInputStream(new File("config2.properties")));
        } catch (IOException ex) {
            Logger.getLogger(LoggingTest.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(LoggingTest.class.getName()).log(Level.SEVERE, null, ex);
        }

        logger = Logger.getLogger("NewLogger");
        logger.info("Message 2");

    }
}