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

在使用java日志API时,如何禁用默认控制台处理程序?,java,java.util.logging,Java,Java.util.logging,嗨,我正在尝试在我的应用程序中实现java日志记录。我想使用两个处理程序。 一个文件处理程序和我自己的控制台处理程序。我的两个经纪人都很好。我的日志被发送到一个文件和控制台。 我的日志也被发送到默认的控制台处理程序,这是我不想要的。如果你运行我的代码,你会看到额外的两行发送到控制台。我不想使用默认的控制台处理程序。有人知道如何禁用默认控制台处理程序吗。 我只想使用我创建的两个处理程序 Handler fh = new FileHandler("test.txt"); fh.setFormatte

嗨,我正在尝试在我的应用程序中实现java日志记录。我想使用两个处理程序。 一个文件处理程序和我自己的控制台处理程序。我的两个经纪人都很好。我的日志被发送到一个文件和控制台。 我的日志也被发送到默认的控制台处理程序,这是我不想要的。如果你运行我的代码,你会看到额外的两行发送到控制台。我不想使用默认的控制台处理程序。有人知道如何禁用默认控制台处理程序吗。 我只想使用我创建的两个处理程序

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



默认控制台处理程序附加到根记录器,根记录器是所有其他记录器(包括您的记录器)的父级。因此,我认为有两种方法可以解决您的问题:

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

logger.setUseParentHandlers(false);
...
import java.util.logging.*;
...
Logger logger = Logger.getLogger(this.getClass().getName());
logger.setUseParentHandlers(false);
...
如果要更改整个应用程序的此行为,可以在添加自己的处理程序之前从根记录器中删除默认控制台处理程序:

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

注意:如果您希望在其他类中也使用相同的日志处理程序,最好的方法是从长远来看将日志配置移动到配置文件中。

默认控制台处理程序附加到根日志记录器,根日志记录器是包括您的日志记录器在内的所有其他日志记录器的父级。因此,我认为有两种方法可以解决您的问题:

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

logger.setUseParentHandlers(false);
...
import java.util.logging.*;
...
Logger logger = Logger.getLogger(this.getClass().getName());
logger.setUseParentHandlers(false);
...
如果要更改整个应用程序的此行为,可以在添加自己的处理程序之前从根记录器中删除默认控制台处理程序:

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

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

这很奇怪,但是
Logger.getLogger(“全局”)
在我的设置中不起作用(以及
Logger.getLogger(Logger.global\u Logger\u NAME)

然而,
Logger.getLogger(“”)做得很好


希望此信息也能帮助某人…

这很奇怪,但是
Logger.getLogger(“全局”)
在我的设置中不起作用(以及
Logger.getLogger(Logger.global\u Logger\u NAME)

然而,
Logger.getLogger(“”)做得很好

希望这些信息也能帮助别人…

就这样做吧

LogManager.getLogManager().reset();
照办

LogManager.getLogManager().reset();

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

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

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

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

您必须指示记录器不要将其消息最多发送到其父记录器:

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

但是,在向记录器添加更多处理程序之前,应先执行此操作。

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

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


但是,在向记录器添加更多处理程序之前,应先执行此操作。

setUseParentHandlers方法有效,谢谢。如何从根记录器中删除默认控制台处理程序?您也可以使用logger.getLogger(“”)-这适用于我,而“全局”不适用(可能是混合中SLF4J的结果?),如果您想要SLF4J,我建议您使用此
LogManager.getLogManager().reset();SLF4JBridgeHandler.install()“”是根记录器的标识符。“全局”是一个命名的记录器(根的子级),默认情况下创建,并应在简单日志场景中使用。此答案对我不适用,但Dominique doessetUseParentHandlers方法的答案有效,谢谢。如何从根记录器中删除默认控制台处理程序?您也可以使用logger.getLogger(“”)-这适用于我,而“全局”不适用(可能是混合中SLF4J的结果?),如果您想要SLF4J,我建议您使用此
LogManager.getLogManager().reset();SLF4JBridgeHandler.install()“”是根记录器的标识符。“global”是一个命名的记录器(root的子项),默认情况下创建,并应在简单日志场景中使用。这个答案对我不起作用,但Dominique doescan的答案告诉我们为什么getLogger(logger.global_logger_NAME)不起作用,但getLogger(“”)起作用?@Deinocherus看到我的评论了吗有人能告诉我们getLogger为什么起作用吗(Logger.GLOBAL\u Logger\u NAME)不起作用,但getLogger(“”)起作用?@Deinochereus看到我对此的评论了吗?我可以温和地建议使用
b.append(formatMessage(arg0))
而不是
b.append(arg0.getMessage())
。通过
formatMessage
方法,您可以使格式化程序与use
public void log兼容(Level-Level,String-msg,Object-param1)
和类似的方法。我可以温和地建议使用
b.append(formatMessage(arg0))
而不是
b.append(arg0.getMessage())
。通过
formatMessage
方法,您可以使您的格式化程序与use
public void log(Level-Level,String-msg,Object-param1)兼容
和类似的方法。谢谢,这是正确的答案。标记为正确的答案不起作用。这应该指出,这将影响每个命名的
记录器的每个处理程序,因此对于更复杂的日志系统来说,这可能是个问题。应该在流程开始时调用一次,以确保未来的记录器不会e受影响。当然,需要控制台的人需要按预期接收一个
ConsoleHandler
。谢谢,这是正确的答案。标记为正确的答案无效。这应该指出,这将影响每个命名
记录器的每个处理程序,因此这可能是更复杂的Log系统。这应该在流程开始时调用一次,以确保未来的记录器不会受到影响。当然,需要控制台的记录器将需要接收一个
ConsoleHandler
,以按预期方式发送。这在我的情况下起到了作用,尽管我必须为此记录器手动添加处理程序。这在m中起到了作用