2017-08-31 34 views
0

我有一个应用程序,我希望日志记录级别设置为INFO,除非设置了调试模式,在这种情况下,我想将级别设置为FINEST是否有可能以编程方式覆盖java.util.logging的properties文件中设置的值?

如果我设置的属性级别文件,它不会从程序中使用logger.setLevel(Level.FINEST)也是,如果我不设置在属性.level领域文件什么,默认情况下,信息水平拍摄,并再次得到重写我如果isDebugEnable()不能覆盖使用FINEST

如何根据条件使此级别可配置?

try(InputStream configFile = getClass().getClassLoader().getResourceAsStream("logging.properties")) { 
     LogManager.getLogManager().readConfiguration(configFile); 
    } catch (IOException e) { 
     throw new IllegalStateException("Unable to load default logging properties.", e); 
    } 
if (isDebugEnabled()) { 
     logger.setLevel(Level.FINEST); 
    } else { 
     logger.setLevel(Level.INFO); 
    } 

我的配置文件如下:

handlers= java.util.logging.ConsoleHandler 
.level= INFO 

# default file output is in user's home directory. 
java.util.logging.FileHandler.pattern = %h/java%u.log 
java.util.logging.FileHandler.limit = 50000 
java.util.logging.FileHandler.count = 1 
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter 

# Enable console to set level to FINEST and above. 
java.util.logging.ConsoleHandler.level = FINEST 
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 

我可以用这个作为跟随做的,但想知道是否有更好的方法来做到这一点。 (可能使用属性文件)

ConsoleHandler consoleHandler = new ConsoleHandler(); 
setLogLevel(); 
consoleHandler.setLevel(Level.FINEST); 
logger.addHandler(new ConsoleHandler()); 
+0

[Java - 动态更改日志记录级别]的可能重复(https://stackoverflow.com/questions/13760095/java-dynamically-change-logging-level) – Avinash

回答

1

如果要设置JVM的启动前DEBUG选项,然后只打包第二logging.properties文件名为debug.properties并更改java.util.logging.config.file当你想调试选项指向debug.properties

handlers= java.util.logging.ConsoleHandler 
.level= FINEST 

# default file output is in user's home directory. 
java.util.logging.FileHandler.pattern = %h/java%u.log 
java.util.logging.FileHandler.level = ALL 
java.util.logging.FileHandler.limit = 50000 
java.util.logging.FileHandler.count = 1 
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter 

# Enable console to set level to show all levels. 
java.util.logging.ConsoleHandler.level = ALL 
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 

如果您必须在运行时设置级别,您将遇到readConfiguration not resetting all everything after boot of the JVM的问题。在JDK 8或更低版本中,您只需调用readConfiguration即可填充默认值并添加更多代码来修复损坏的行为。由于您只需要在处理程序上设置级别,只需添加该代码即可。

try(InputStream configFile = getClass().getClassLoader().getResourceAsStream("logging.properties")) { 
    LogManager.getLogManager().readConfiguration(configFile); 
} catch (IOException e) { 
    throw new IllegalStateException("Unable to load default logging properties.", e); 
} 

Level lvl; 
if (isDebugEnabled()) { 
    lvl = Level.FINEST; 
} else { 
    lvl = Level.INFO; 
} 
logger.setLevel(lvl); 
for(Handler h : logger.getHandlers()) { 
    h.setLevel(lvl); 
} 

JDK 9提供了一种方法updateConfiguration,将工作围绕readConfiguration方法的断裂行为。

相关问题