当前位置: 代码迷 >> J2SE >> Java日志输出有关问题
  详细解决方案

Java日志输出有关问题

热度:79   发布时间:2016-04-23 20:38:58.0
Java日志输出问题
在使用java.util.logger的时候,我遇到了一个奇怪的问题,在Java API文档中指出,
Logger.setLevel(..)
Set the log level specifying which message levels will be logged by this logger. Message levels lower than this value will be discarded. The level value Level.OFF can be used to turn off logging.
但是,我的机器运行结果却不是这样。这个方法并没有产生作用。
我的代码如下:

public class ProgramFlags {

public static void main(String[] args) throws SecurityException, Exception {
LogManager lm = LogManager.getLogManager();
Logger patentLog,childLog;
FileHandler xml_handler = new FileHandler("log_output.xml");
FileHandler html_handler = new FileHandler("log_output.html");

patentLog = Logger.getLogger("ParentLogger");
childLog = Logger.getLogger("ParentLogger.ChildLogger");


patentLog.setLevel(Level.INFO);
childLog.setLevel(Level.ALL);
lm.addLogger(patentLog);
lm.addLogger(childLog);

xml_handler.setFormatter(new XMLFormatter());
html_handler.setFormatter(new HTMLFormatter());

childLog.addHandler(xml_handler);
patentLog.addHandler(html_handler);

childLog.log(Level.FINE,"this is a fine log message");
patentLog.log(Level.SEVERE, "this is a server log message");

xml_handler.close();
html_handler.close();
}

}
class HTMLFormatter extends java.util.logging.Formatter
{

@Override
public String format(LogRecord record) {
// TODO Auto-generated method stub
return (" <tr><td>"+(new Date(record.getMillis())).toString()
+"</td><td>"+record.getMessage()+"</td>"
+ "<td>"+record.getLoggerName()+"</td></tr>\n");
}
public String getHead(Handler h)
{
return ("<html>\n<body>\n"+
" <table border>\n"+
"<tr><th>Time</th><th>Log Message</th></tr>\n");
}
public String getTail(Handler h)
{
return (" </table>\n</body>\n</html>");
}
}


运行结果:
html文件:

<html>
<body>
<table border>
<tr><th>Time</th><th>Log Message</th></tr>
<tr><td>Tue Jun 10 21:23:39 CST 2014</td><td>this is a fine log message</td><td>ParentLogger.ChildLogger</td></tr>
<tr><td>Tue Jun 10 21:23:39 CST 2014</td><td>this is a server log message</td><td>ParentLogger.ChildLogger</td></tr>
</table>
</body>
</html>


xml文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2014-06-10T21:23:39</date>
  <millis>1402406619799</millis>
  <sequence>0</sequence>
  <logger>ParentLogger.ChildLogger</logger>
  <level>FINE</level>
  <class>testChangeVar.ProgramFlags</class>
  <method>main</method>
  <thread>1</thread>
  <message>this is a fine log message</message>
</record>
<record>
  <date>2014-06-10T21:23:39</date>
  <millis>1402406619818</millis>
  <sequence>1</sequence>
  <logger>ParentLogger.ChildLogger</logger>
  <level>SEVERE</level>
  <class>testChangeVar.ProgramFlags</class>
  <method>main</method>
  <thread>1</thread>
  <message>this is a server log message</message>
</record>
</log>


按照APi的解释,html文件,归属patentLog,其等级为Level.INFO, 大于Level.FINE,应该丢弃FINE信息,可为什么日志文件中却有那一项,并且输出来源为ParentLogger.ChildLogger

求各位大神解释。。
------解决方案--------------------
childLog.setLevel(Level.ALL); 所以 childLog.log(Level.FINE,"this is a fine log message");这条语句会输出记录。这与父logger的级别无关。
childLog = Logger.getLogger("ParentLogger.ChildLogger");所以chileLog输出的记录来源当然是ParentLogger.ChildLogger
------解决方案--------------------
这个暂时不知,建议你找找文档,查明parent logger与child logger的关系。最彻底的是看logger的源代码,开源的,不会太难。
  相关解决方案