Java记录API生成空的日志文件 [英] Java Logging API generating empty log files

查看:156
本文介绍了Java记录API生成空的日志文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图去通过在Java记录API教程:

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

但生成的文件是空的(在Netbeans中测试时,Eclipse以及运行CMD从罐子里)。日志消息显示在仅控制台。

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

项目:de.vogella.logger

MyHtmlFormatter.java

 包de.vogella.logger;进口java.text.SimpleDateFormat的;
进口java.util.Date;
进口java.util.logging.Formatter;
进口java.util.logging.Handler中;
进口java.util.logging.Level中;
进口java.util.logging.LogRecord中;//这个定义格式格式化日志记录的部分单行
类MyHtmlFormatter扩展格式化{
  //此方法要求每个日志记录
  公共字符串格式(REC的LogRecord){
    StringBuffer的BUF =新的StringBuffer(1000);
    //大胆任何级别> =警告
    buf.append(&所述; TR>中);
    buf.append(&所述; TD>中);    如果(rec.getLevel()的intValue()方式> = Level.WARNING.intValue()){
      buf.append(< B>中);
      buf.append(rec.getLevel());
      buf.append(&下; / B>中);
    }其他{
      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);
    返回buf.toString();
  }  私人字符串calcDate(长的毫秒){
    SimpleDateFormat的DATE_FORMAT =新的SimpleDateFormat(MMM DD,YYYY HH:MM);
    日期resultdate =新的日期(的毫秒);
    返回date_format.format(resultdate);
  }  //此方法处理程序使用此刚过叫
  //格式创​​建
  公共字符串getHead(处理器高){
    返回< HTML> \\ n< HEAD> \\ n+(新的Date())
        +\\ n< / HEAD> \\ n< BODY> \\ n< pre> \\ N
        +<表格的宽度= \\100%\\边境> \\ N
        +< TR>百分位>级< /第i +
        <第i个时间和LT; /第i +
        <第i个日志消息< /第i +
        < / TR> \\ N的;
  }  //此方法处理程序使用此刚过叫
  //格式化关闭
  公共字符串getTail(处理器高){
    回归< /表> \\ n< / pre>< / BODY> \\ n< / HTML> \\ N的;
  }
}

MyLogger.java

 包de.vogella.logger;进口java.io.IOException异常;
进口java.util.logging.FileHandler;
进口java.util.logging.Formatter;
进口java.util.logging.Level中;
进口java.util.logging.Logger中;
进口java.util.logging.SimpleFormatter;公共类MyLogger {
  静态专用的FileHandler fileTxt;
  静态专用SimpleFormatter formatterTxt;  静态专用的FileHandler fileHTML;
  静态专用格式化formatterHTML;  静态公共无效设置()抛出IOException    //获取全局logger进行配置
    记录器记录= Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);    logger.setLevel(Level.INFO);
    fileTxt =新的FileHandler(Logging.txt);
    fileHTML =新的FileHandler(Logging.html);    //创建TXT格式化
    formatterTxt =新SimpleFormatter();
    fileTxt.setFormatter(formatterTxt);
    logger.addHandler(fileTxt);    //创建HTML格式化
    formatterHTML =新MyHtmlFormatter();
    fileHTML.setFormatter(formatterHTML);
    logger.addHandler(fileHTML);
  }
}

UseLogger.java

 包de.vogella.logger.test;进口java.io.IOException异常;
进口java.util.logging.Level中;
进口java.util.logging.Logger中;进口de.vogella.logger.MyLogger;公共类UseLogger {
  //总是使用类名,这样你可以重构
  私人最终静态记录器记录仪= Logger.getLogger(UseLogger.class
      .getName());  公共无效doSomeThingAndLog(){
    //形象在这里一些实实在在的工作    //现在我们演示记录    //设置的LogLevel到严重,仅将严重消息将被写入
    LOGGER.setLevel(Level.SEVERE);
    LOGGER.severe(信息记录);
    LOGGER.warning(信息记录);
    LOGGER.info(信息记录);
    LOGGER.finest(真的不重要);    //设置的LogLevel到信息,严重警告和信息将被写入
    //最美好的还是不写
    LOGGER.setLevel(Level.INFO);
    LOGGER.severe(信息记录);
    LOGGER.warning(信息记录);
    LOGGER.info(信息记录);
    LOGGER.finest(真的不重要);
  }  公共静态无效的主要(字串[] args){
    UseLogger测试=新UseLogger();
    尝试{
      MyLogger.setup();
    }赶上(IOException异常五){
      e.printStackTrace();
      抛出新的RuntimeException(与创建日志文件问题);
    }
    tester.doSomeThingAndLog();
  }
}


解决方案

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

  //获取全局logger进行配置
记录器记录= Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

  //获取全局logger进行配置
记录器记录= Logger.getLogger();

查看更多:

I tried to go through the tutorial on the Java logging API:

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

But the generated files are empty (tested in Netbeans, Eclipse as well as running the jar from cmd). The log messages are displayed in the console only.

The following are the files used in the project. What might be the reason for such behavior?

Project: 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();
  }
} 

解决方案

Change the following line (in the method de.vogella.logger.MyLogger.setup()):

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

with:

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

See more:

这篇关于Java记录API生成空的日志文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆