当前位置: 首页 > 面试题库 >

使用Java日志记录API时如何禁用默认控制台处理程序?

程阳平
2023-03-14
问题内容

嗨,我正在尝试在我的应用程序中实现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. ??");
    }
}

问题答案:

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

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

logger.setUseParentHandlers(false);

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

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

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



 类似资料:
  • 我正在寻找一种禁用log4j日志控制台的方法。我在网上找到了一些解决方案,但都没用: 禁用log4j控制台日志记录并启用文件日志记录 禁用Java中的Log4J输出 log4j.properties为: 有没有简单的方法将log4j禁用到文件中?

  • 无需创建特定的配置。因为我使用而不必亲自配置日志记录。

  • 我需要禁用我的web应用程序控制台中的应用程序日志。下面的logback-spring.xml强制spring使用文件appender而不是控制台appender。然而,现在的问题是,我的应用程序日志是用来自所有包的所有日志编写的,甚至是来自那些在logback-spring.xml中没有指定的包的日志 我使用的是spring Boot1.5.2。我使用logging.file键在applicat

  • 如何禁用应用程序中出现的窗口,并在生产模式下仅打开浏览器控制台? 是我们必须禁用ConsoleHandler吗?或者在生产模式下我必须使用SimpleRemoteLogHandler? 还有一个FirebugLogHandler,但仅限于Firebug。

  • 问题内容: 我正在尝试禁用的日志输出。 在加载驱动程序之前,我曾尝试在应用程序的开头设置这些设置,但没有帮助。 我收到这种日志: 所以我的控制台完全塞满了mongo日志,我什么也看不到。 问题答案: 所以这解决了这个问题: 如果您希望隐藏所有日志,可以将其设置为较高的值。

  • 问题内容: 我有一些使用该软件包的工具化代码。现在该关闭日志记录了,我无法确定如何关闭标准记录器。 我错过了什么吗?我应该在进行日志调用之前检查标志,还是在生产中将其注释掉? 问题答案: 要完全禁用日志,最好调用Joril并将输出设置为无操作(例如) 但即使在此之后,操作仍将闲置约500-600 ns / op 1 这仍然可切断短路(左右 为100 ns / OP )通过使用自定义的实现,并实现所