首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在使用java日志API时,如何禁用默认控制台处理程序?

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

Stack Overflow用户
提问于 2010-03-28 22:25:01
回答 5查看 103.9K关注 0票数 95

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

代码语言:javascript
复制
Handler fh = new FileHandler("test.txt");
fh.setFormatter(formatter);
logger.addHandler(fh);

代码语言:javascript
复制
Handler ch = new ConsoleHandler();
ch.setFormatter(formatter);
logger.addHandler(ch);

代码语言:javascript
复制
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. ??");
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-28 22:34:12

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

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

代码语言:javascript
复制
logger.setUseParentHandlers(false);

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

代码语言:javascript
复制
Logger globalLogger = Logger.getLogger("global");
Handler[] handlers = globalLogger.getHandlers();
for(Handler handler : handlers) {
    globalLogger.removeHandler(handler);
}

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

票数 106
EN

Stack Overflow用户

发布于 2010-07-29 22:48:17

只管去做

代码语言:javascript
复制
LogManager.getLogManager().reset();
票数 111
EN

Stack Overflow用户

发布于 2010-06-29 22:34:39

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

然而,Logger.getLogger("")做得很好。

希望这些信息也能帮助到某些人。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2533227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档