最简单的可能设置 Java 日志记录级别,它仍然失败。但是,System.out.println 仍然有效
Simplest possible setting Java logging level, and it still fails. But, System.out.println still works
我在 一些 的构造函数中无法打印日志。对于其他人,日志记录工作正常。
我试图通过使用默认值并在 class 本身内明确设置日志级别来消除所有可能的混淆来源。我尝试将记录器实例化为静态变量和实例变量。
但是,即使将日志记录级别设置为“Level.ALL”在某些 classes 中似乎也不起作用。
对于实例记录器,我一直在 instance-initializer / anonymous block。对于静态实例,我使用静态块来设置日志记录级别。
知道为什么日志消息没有在下面的 class 中打印出来吗?
注意:根据@jmehrens
的评论,代码已被编辑以显示修复
public abstract class ReadFileInformation extends SimpleFileVisitor<Path> {
static public ConsoleHandler globalConsoleHandler = new ConsoleHandler(); // fix, based on comment by @jmehrens
static private final Logger logger = Logger.getLogger(ReadFileInformation.class.getName());
static { // fix: See comment by @jmehrens
globalConsoleHandler.setLevel(Level.ALL);
logger.addHandler(globalConsoleHandler);
}
{
logger.setLevel(Level.ALL);
logger.log(Level.FINEST, String.format("This does NOT print.\n"));
System.out.println("In ReadFileInformation Static Block. This prints out!");
}
}
public class ReadMetadateFileInformation extends ReadFileInformation {
static private final Logger logger = Logger.getLogger(ReadMetadateFileInformation.class.getName());
static {
logger.setLevel(Level.ALL);
logger.log(Level.FINEST, String.format("This does NOT print.\n"));
System.out.println("In ReadMetadateFileInformation Static Block. This prints out!");
}
{
logger.log(Level.FINEST, String.format("This does NOT print.\n"));
System.out.println("In ReadMetadateFileInformation Anonymous Block. This prints out!");
}
public ReadMetadateFileInformation() {
super();
logger.log(Level.FINE, String.format("This does NOT print.\n"));
}
}
根据 java.util.logging.ConsoleHandler 文档:
.level specifies the default level for the Handler (defaults to Level.INFO).
您正在调整记录器以将级别设置为 ALL,这将生成您想要查看的日志记录。但是,ConsoleHandler 将过滤它们,因为 ConsoleHandler 的默认级别是 INFO。因此,您也必须调整 ConsoleHandler 的级别。您需要执行以下操作之一:
- 添加一个 ConsoleHandler 并将级别设置为 ALL。
- 修改根ConsoleHandler,将级别设置为ALL。
由于您是通过代码修改记录器配置,因此执行 #1 可能更容易。
ConsoleHandler ch = new ConsoleHandler();
ch.setLevel(Level.ALL);
logger.addHandler(ch);
logger.setLevel(Level.ALL);
logger.log(Level.FINEST, String.format("This does NOT print.\n"));
您还必须确保不要将 ConsoleHandler 多次添加到记录器,因为每次添加处理程序都会导致重复的控制台输出。
我在 一些 的构造函数中无法打印日志。对于其他人,日志记录工作正常。
我试图通过使用默认值并在 class 本身内明确设置日志级别来消除所有可能的混淆来源。我尝试将记录器实例化为静态变量和实例变量。
但是,即使将日志记录级别设置为“Level.ALL”在某些 classes 中似乎也不起作用。
对于实例记录器,我一直在 instance-initializer / anonymous block。对于静态实例,我使用静态块来设置日志记录级别。
知道为什么日志消息没有在下面的 class 中打印出来吗?
注意:根据@jmehrens
的评论,代码已被编辑以显示修复public abstract class ReadFileInformation extends SimpleFileVisitor<Path> {
static public ConsoleHandler globalConsoleHandler = new ConsoleHandler(); // fix, based on comment by @jmehrens
static private final Logger logger = Logger.getLogger(ReadFileInformation.class.getName());
static { // fix: See comment by @jmehrens
globalConsoleHandler.setLevel(Level.ALL);
logger.addHandler(globalConsoleHandler);
}
{
logger.setLevel(Level.ALL);
logger.log(Level.FINEST, String.format("This does NOT print.\n"));
System.out.println("In ReadFileInformation Static Block. This prints out!");
}
}
public class ReadMetadateFileInformation extends ReadFileInformation {
static private final Logger logger = Logger.getLogger(ReadMetadateFileInformation.class.getName());
static {
logger.setLevel(Level.ALL);
logger.log(Level.FINEST, String.format("This does NOT print.\n"));
System.out.println("In ReadMetadateFileInformation Static Block. This prints out!");
}
{
logger.log(Level.FINEST, String.format("This does NOT print.\n"));
System.out.println("In ReadMetadateFileInformation Anonymous Block. This prints out!");
}
public ReadMetadateFileInformation() {
super();
logger.log(Level.FINE, String.format("This does NOT print.\n"));
}
}
根据 java.util.logging.ConsoleHandler 文档:
.level specifies the default level for the Handler (defaults to Level.INFO).
您正在调整记录器以将级别设置为 ALL,这将生成您想要查看的日志记录。但是,ConsoleHandler 将过滤它们,因为 ConsoleHandler 的默认级别是 INFO。因此,您也必须调整 ConsoleHandler 的级别。您需要执行以下操作之一:
- 添加一个 ConsoleHandler 并将级别设置为 ALL。
- 修改根ConsoleHandler,将级别设置为ALL。
由于您是通过代码修改记录器配置,因此执行 #1 可能更容易。
ConsoleHandler ch = new ConsoleHandler();
ch.setLevel(Level.ALL);
logger.addHandler(ch);
logger.setLevel(Level.ALL);
logger.log(Level.FINEST, String.format("This does NOT print.\n"));
您还必须确保不要将 ConsoleHandler 多次添加到记录器,因为每次添加处理程序都会导致重复的控制台输出。