在使用 java 日志记录 API 时,如何禁用默认控制台处理程序?
您好,我正在尝试在我的应用程序中实现 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. ??");
}
}
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.
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. ??");
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
只要做
Just do
默认控制台处理程序附加到根记录器,它是所有其他记录器(包括您的记录器)的父记录器。因此,我看到两种方法可以解决您的问题:
如果这仅影响您的这个特定类,最简单的解决方案是禁止将日志传递到父记录器:
如果您想更改整个应用程序的此行为,您可以在添加您自己的处理程序之前,可以从根记录器中完全删除默认的控制台处理程序:
注意:如果您也想在其他类中使用相同的日志处理程序,从长远来看,最好的方法是将日志配置移动到配置文件中。
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:
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:
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.
这很奇怪,但 Logger.getLogger("global") 在我的设置中不起作用(以及 Logger.getLogger(Logger.GLOBAL_LOGGER_NAME))。
然而 Logger.getLogger("") 可以很好地完成这项工作。
希望这个信息也能帮助别人......
This is strange but
Logger.getLogger("global")
does not work in my setup (as well asLogger.getLogger(Logger.GLOBAL_LOGGER_NAME)
).However
Logger.getLogger("")
does the job well.Hope this info also helps somebody...
重置配置并将根级别设置为 OFF
Do a reset of the configuration and set the root level to OFF
您必须指示您的记录器不要将其消息发送到其父记录器:
但是,应该在向记录器添加更多处理程序之前完成此操作。
You must instruct your logger not to send its messages on up to its parent logger:
However, this should be done before adding any more handlers to logger.