最简单的Java日志级别设置,但仍然失败。但是System.out.println仍然有效
我在一些构造函数中打印日志时遇到问题。对于其他人来说,日志记录就像我期望的那样工作 我试图通过使用默认值和在类本身中显式设置日志级别来消除所有可能的混淆源。我尝试将记录器实例化为静态变量和实例变量 但是,即使将日志记录级别设置为“level.ALL”在某些类中似乎也不起作用 例如loggers,我一直在实例初始值设定项/匿名块中设置日志级别。对于静态实例,我使用静态块来设置日志记录级别 知道为什么日志消息没有在下面的类中打印出来吗 注意:根据@jmehrens的评论,代码已被编辑以显示修复最简单的Java日志级别设置,但仍然失败。但是System.out.println仍然有效,java,logging,java.util.logging,Java,Logging,Java.util.logging,我在一些构造函数中打印日志时遇到问题。对于其他人来说,日志记录就像我期望的那样工作 我试图通过使用默认值和在类本身中显式设置日志级别来消除所有可能的混淆源。我尝试将记录器实例化为静态变量和实例变量 但是,即使将日志记录级别设置为“level.ALL”在某些类中似乎也不起作用 例如loggers,我一直在实例初始值设定项/匿名块中设置日志级别。对于静态实例,我使用静态块来设置日志记录级别 知道为什么日志消息没有在下面的类中打印出来吗 注意:根据@jmehrens的评论,代码已被编辑以显示修复 pu
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"));
}
}
公共抽象类ReadFileInformation扩展了SimpleFileVisitor{
静态公共控制台handler globalConsoleHandler=new ConsoleHandler();//修复,基于@jmehrens的注释
静态私有最终记录器Logger=Logger.getLogger(ReadFileInformation.class.getName());
静态{//fix:参见@jmehrens的注释
globalConsolleHandler.setLevel(Level.ALL);
logger.addHandler(globalConsolleHandler);
}
{
logger.setLevel(Level.ALL);
logger.log(Level.FINEST,String.format(“这不打印。\n”);
System.out.println(“在ReadFileInformation静态块中。这个打印输出!”);
}
}
公共类ReadMetadateFileInformation扩展了ReadFileInformation{
静态私有最终记录器Logger=Logger.getLogger(ReadMetadateFileInformation.class.getName());
静止的{
logger.setLevel(Level.ALL);
logger.log(Level.FINEST,String.format(“这不打印。\n”);
System.out.println(“在ReadMetadateFileInformation静态块中。这个打印输出!”);
}
{
logger.log(Level.FINEST,String.format(“这不打印。\n”);
System.out.println(“在ReadMetadateFileInformation匿名块中。这个打印输出!”);
}
公共ReadMetadateFileInformation(){
超级();
logger.log(Level.FINE,String.format(“这不打印。\n”);
}
}
根据文档:
.level指定处理程序的默认级别(默认为level.INFO)
您正在调整记录器,以将级别设置为所有将生成您希望查看的日志记录的级别。但是,ConsoleHandler将过滤它们,因为ConsoleHandler的默认级别是INFO。因此,您也必须调整控制台手柄的级别。您需要执行以下操作之一:
您还必须确保不会将ConsoleHandler多次添加到记录器,因为每次添加处理程序都会导致控制台输出重复。
System.out.print
ing与记录器
无关。我还猜测这与子类化也没有任何关系-基本上(代码为POST)不Log
我建议您创建一个非常简单的类,只需一个main
即可获得打印。添加System.out.print的唯一目的是向自己证明代码实际上已经到达代码中的该点,然后忽略日志语句。正如@jmehrens所建议的那样,添加ConsoleHandler确实起到了作用!谢谢大家!!除了一个打字错误,它工作得很好!addHandler()与addHandler()的比较。
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"));