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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2533227/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 08:56:34  来源:igfitidea点击:

How can I disable the default console handler, while using the java logging API?

javajava.util.logging

提问by loudiyimo

Hi I am trying to implement the java logging in my application. I want to use two handlers. A file handler and my own console handler. Both of my handlers work fine. My logging is send to a file and to the console . My logging is also sent to the default console handler, which i do not want. If you run my code you will see extra two line sent to the console. I don't want to use the default console handler. Does anyone know how to disable the default console handler. I only want to use the two handlers I have created.

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

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. ??");
    }
}

采纳答案by Péter T?r?k

The default console handler is attached to the root logger, which is a parent of all other loggers including yours. So I see two ways to solve your problem:

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

If this is only affects this particular class of yours, the simplest solution would be to disable passing the logs up to the parent logger:

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

logger.setUseParentHandlers(false);

If you want to change this behaviour for your whole app, you could remove the default console handler from the root logger altogether before adding your own handlers:

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

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

Note: if you want to use the same log handlers in other classes too, the best way is to move the log configuration into a config file in the long run.

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

回答by Dime

This is strange but Logger.getLogger("global") does not work in my setup (as well as Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)).

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

However Logger.getLogger("")does the job well.

但是Logger.getLogger(""),这项工作做得很好。

Hope this info also helps somebody...

希望这些信息也可以帮助某人...

回答by Dominique

Just do

做就是了

LogManager.getLogManager().reset();

回答by Manuel

Do a reset of the configuration and set the root level to OFF

重置配置并将根级别设置为关闭

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

回答by JustSayin

You must instruct your logger not to send its messages on up to its parent logger:

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

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

However, this should be done before adding any more handlers to logger.

但是,这应该在向记录器添加更多处理程序之前完成。