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

Java Logging API生成空的日志文件

夏侯野
2023-03-14
问题内容

我尝试遍历有关Java日志记录API的教程:

www.vogella.com/articles/Logging/article.html

但是生成的文件是空的(在Netbeans,Eclipse中进行了测试以及从cmd运行jar)。日志消息仅显示在控制台中。

以下是项目中使用的文件。发生这种行为的原因可能是什么?

项目:de.vogella.logger

MyHtmlFormatter.java

package de.vogella.logger;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;

//This custom formatter formats parts of a log record to a single line
class MyHtmlFormatter extends Formatter {
  // This method is called for every log records
  public String format(LogRecord rec) {
    StringBuffer buf = new StringBuffer(1000);
    // Bold any levels >= WARNING
    buf.append("<tr>");
    buf.append("<td>");

    if (rec.getLevel().intValue() >= Level.WARNING.intValue()) {
      buf.append("<b>");
      buf.append(rec.getLevel());
      buf.append("</b>");
    } else {
      buf.append(rec.getLevel());
    }
    buf.append("</td>");
    buf.append("<td>");
    buf.append(calcDate(rec.getMillis()));
    buf.append(' ');
    buf.append(formatMessage(rec));
    buf.append('\n');
    buf.append("<td>");
    buf.append("</tr>\n");
    return buf.toString();
  }

  private String calcDate(long millisecs) {
    SimpleDateFormat date_format = new SimpleDateFormat("MMM dd,yyyy HH:mm");
    Date resultdate = new Date(millisecs);
    return date_format.format(resultdate);
  }

  // This method is called just after the handler using this
  // formatter is created
  public String getHead(Handler h) {
    return "<HTML>\n<HEAD>\n" + (new Date()) 
        + "\n</HEAD>\n<BODY>\n<PRE>\n"
        + "<table width=\"100%\" border>\n  "
        + "<tr><th>Level</th>" +
        "<th>Time</th>" +
        "<th>Log Message</th>" +
        "</tr>\n";
  }

  // This method is called just after the handler using this
  // formatter is closed
  public String getTail(Handler h) {
    return "</table>\n  </PRE></BODY>\n</HTML>\n";
  }
}

MyLogger.java

package de.vogella.logger;

import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

public class MyLogger {
  static private FileHandler fileTxt;
  static private SimpleFormatter formatterTxt;

  static private FileHandler fileHTML;
  static private Formatter formatterHTML;

  static public void setup() throws IOException {

    // Get the global logger to configure it
    Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

    logger.setLevel(Level.INFO);
    fileTxt = new FileHandler("Logging.txt");
    fileHTML = new FileHandler("Logging.html");

    // Create txt Formatter
    formatterTxt = new SimpleFormatter();
    fileTxt.setFormatter(formatterTxt);
    logger.addHandler(fileTxt);

    // Create HTML Formatter
    formatterHTML = new MyHtmlFormatter();
    fileHTML.setFormatter(formatterHTML);
    logger.addHandler(fileHTML);
  }
}

UseLogger.java

package de.vogella.logger.test;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import de.vogella.logger.MyLogger;

public class UseLogger {
  // Always use the classname, this way you can refactor
  private final static Logger LOGGER = Logger.getLogger(UseLogger.class
      .getName());

  public void doSomeThingAndLog() {
    // Image here some real work

    // Now we demo the logging

    // Set the LogLevel to Severe, only severe Messages will be written
    LOGGER.setLevel(Level.SEVERE);
    LOGGER.severe("Info Log");
    LOGGER.warning("Info Log");
    LOGGER.info("Info Log");
    LOGGER.finest("Really not important");

    // Set the LogLevel to Info, severe, warning and info will be written
    // Finest is still not written
    LOGGER.setLevel(Level.INFO);
    LOGGER.severe("Info Log");
    LOGGER.warning("Info Log");
    LOGGER.info("Info Log");
    LOGGER.finest("Really not important");
  }

  public static void main(String[] args) {
    UseLogger tester = new UseLogger();
    try {
      MyLogger.setup();
    } catch (IOException e) {
      e.printStackTrace();
      throw new RuntimeException("Problems with creating the log files");
    }
    tester.doSomeThingAndLog();
  }
}

问题答案:

更改以下行(在方法中de.vogella.logger.MyLogger.setup()):

// Get the global logger to configure it
Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

与:

// Get the global logger to configure it
Logger logger = Logger.getLogger("");

看更多:

  • Java记录
  • Java记录:配置
  • Java记录框架


 类似资料:
  • 我有一个简单的Spring boot rest API应用程序。我通过application.property文件中提到的以下属性管理日志。 logging.level.org.springframework=info 我可以看到在控制台打印日志,但在通过应用程序创建的日志文件中没有看到相同的日志。 我漏掉什么了吗?

  • 我试图实现log4j。我用log4j创建了一个示例java程序。 下面是我的log4j。属性: 我正在控制台屏幕上获取输出。但是没有生成日志文件。我必须做什么才能生成日志文件,谢谢

  • 我从log4j1迁移过来。x到log4j2。我删除了log4j。属性文件并创建了log4j2。xml文件。迁移后,我运行了应用程序,但找不到。日志文件。 有没有人能告诉我

  • 我是log4j的新手。我创建了一个在其中实现log4j的示例java程序。 下面是java程序: 我正在控制台屏幕上获取输出。但是没有生成日志文件。我还使用以下链接在Eclipse neon中配置了我的项目:配置 我做了一切好事。但是日志文件没有生成。当我以编程方式实现log4j时,文件正在生成。以下是我的属性文件: 我需要做什么才能让Log4J写入日志文件?

  • 我的任务是升级一个大型服务类型的java程序(不是我写的,第一次接触它),它有大量的开源库。我正在升级到log4j2,它以前有log4j,但我不知道它是否工作正常。 我根本拿不到日志文件。这是在使用NetBeans 8的本地开发环境中。我的类路径中有log4j-api和log4j-core2.9.0文件。我在项目根目录中的log4j2.xml文件是: 类日志变量是(是的,类名是Main,它扩展了一

  • 我最近升级到了log4j2,发现当java进程启动并初始化log4j上下文时,log4j为我的所有滚动文件追加器创建了空日志文件。因此,即使我的一些作业线程没有运行,它们也会为相关appender创建空日志文件。 有没有办法将日志文件的创建推迟到触发第一个LogEvent的时间? 附言-我见过如何让log4j仅按需创建日志文件?但它没有多大帮助。