如何禁用默认的控制台处理程序,而使用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器之前,应该这样做。