如何禁用默认的控制台处理程序,而使用java日志API?

嗨,我想在我的应用程序中实现Java日志logging。 我想用两个处理程序。 文件处理程序和我自己的控制台处理程序 我的两个处理程序都正常工作。 我的日志logging发送到文件和控制台。 我的日志logging也发送到默认的控制台处理程序,我不想要。 如果你运行我的代码,你会看到额外的两行发送到控制台。 我不想使用默认的控制台处理程序。 有谁知道如何禁用默认的控制台处理程序。 我只想使用我创build的两个处理程序。

Handler fh = new FileHandler("test.txt"); fh.setFormatter(formatter); logger.addHandler(fh); 

 Handler ch = new ConsoleHandler(); ch.setFormatter(formatter); logger.addHandler(ch); 

 import java.util.Date; import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Formatter; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.LogRecord; import java.util.logging.Logger; public class LoggingExample { private static Logger logger = Logger.getLogger("test"); static { try { logger.setLevel(Level.INFO); Formatter formatter = new Formatter() { @Override public String format(LogRecord arg0) { StringBuilder b = new StringBuilder(); b.append(new Date()); b.append(" "); b.append(arg0.getSourceClassName()); b.append(" "); b.append(arg0.getSourceMethodName()); b.append(" "); b.append(arg0.getLevel()); b.append(" "); b.append(arg0.getMessage()); b.append(System.getProperty("line.separator")); return b.toString(); } }; Handler fh = new FileHandler("test.txt"); fh.setFormatter(formatter); logger.addHandler(fh); Handler ch = new ConsoleHandler(); ch.setFormatter(formatter); logger.addHandler(ch); LogManager lm = LogManager.getLogManager(); lm.addLogger(logger); } catch (Throwable e) { e.printStackTrace(); } } public static void main(String[] args) { logger.info("why does my test application use the standard console logger ?\n" + " I want only my console handler (Handler ch)\n " + "how can i turn the standard logger to the console off. ??"); } } 

默认的控制台处理程序连接到根logging器,它是所有其他logging器(包括您的logging器)的父项。 所以我看到两种方法来解决你的问题:

如果这只影响你的这个特定的类,最简单的解决方法是禁用将日志传递给父logging器:

 logger.setUseParentHandlers(false); 

如果要为整个应用程序更改此行为,则可以在添加自己的处理程序之前,从根logging器中删除默认的控制台处理程序:

 Logger globalLogger = Logger.getLogger("global"); Handler[] handlers = globalLogger.getHandlers(); for(Handler handler : handlers) { globalLogger.removeHandler(handler); } 

注意:如果您也想在其他类中使用相同的日志处理程序,最好的办法是将日志configuration从长远的angular度移动到configuration文件中。

做就是了

 LogManager.getLogManager().reset(); 

这很奇怪,但Logger.getLogger("global")不能在我的设置(以及Logger.getLogger(Logger.GLOBAL_LOGGER_NAME) )中工作。

然而Logger.getLogger("")很好地完成了这项工作。

希望这个信息也有助于某人…

重置configuration并将根级别设置为OFF

 LogManager.getLogManager().reset(); Logger globalLogger = Logger.getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME); globalLogger.setLevel(java.util.logging.Level.OFF); 

您必须指示您的logging器不要将其消息发送到其父logging器:

 ... import java.util.logging.*; ... Logger logger = Logger.getLogger(this.getClass().getName()); logger.setUseParentHandlers(false); ... 

但是,在添加更多的处理程序到logging器之前,应该这样做。