0
0

Java logging快速教程

2011/10/26 · 评论 

1. 总览
1.1. java Logging(日志)

The JDk 包含有 “java logging API”, 如果你适当的使用这些API, 包括提供类来设置优先等级,格式化日志信息,你就可以有效的通过logger把日志保存到一个位置或者报告错误,这篇文章将向您简要的介绍怎样使用Logging API, 阅读之后,你就可以马上应用到你的项目中。

1.2 创建一个Logger
在java.util.logging包里已经提供了Logging功能的Logger, 要创建一个logger,在你的代码里申明:

import java.util.logging.Logger;

private final static Logger LOGGER = Logger.getLogger(MyClass.class .getName());

1.3 等级level
日志等级已经定义了日志信息的警惕等级性. level 类是用来定义什么程度的日志必须被记录。日志等级分为:

  • SEVERE (最高级)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST
  • 除了以上这些等级之外,还有等级 OFF 和 ALL 来定义停止日志记录和启用日志记录。
    比如,以下的Logger将会把等级设置为 INFO, 这说明,所有的 INFO,WARNING 和 SEVERE等级的日志将被记录起来。

    LOGGER.setLevel(Level.INFO);
    

    1.4. 处理者(Handler)
    每个Logger可以有几个处理者(handler). 每个handler从Logger接收日志信息并把他们保存到一个对象, 比如一个文件。
    一个handler可以通过设置 setLevel(Level.OFF)来停止记录功能, 或通过设置 setLevel(Level.ON)来启用记录功能。

    Java 已经定义了一些标准的Handler.如:
    ConsoleHandler: 把日志信息写到IDE的信息框
    FileHandler: 把日志信息写到一个文档

    设置Level为INFO及以上的, 日志信息将被自动写到IDE的信息框

    1.5. 格式化(Formatter)
    每个Handler的输出功能可以运用格式化功能,这表示当你在记录日志是,你可以设置你所想要的格式。

    可用的格式有:
    SimpleFormatter 产生文档日志
    XMLFormatter 产生xml格式的文档日志

    当然你也可以创建自己的格式化类,以下是个例子:

    package logging;
    
    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;
    
    class MyHtmlFormatter extends Formatter
    {
    	// 格式化日志
    	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("");
    			buf.append(rec.getLevel());
    			buf.append("");
    		} 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);
    	}
    
    	//输出头部
    	public String getHead(Handler h)
    	{
    		return "<HTML>\n<HEAD>\n" + (new Date()) + "\n</HEAD>\n<BODY>\n<PRE>\n"
    				+ "<table border>\n  "
    				+ "<tr><th>Time</th><th>Log Message</th></tr>\n";
    	}
    
    	//输出尾部
    	public String getTail(Handler h)
    	{
    		return "</table>\n  </PRE></BODY>\n</HTML>\n";
    	}
    }
    

    1.6. Log 管理者(log manager)
    log manager 是负责创建和管理Logger和各种配置。
    通过调用函数LogManager.setLevel(String name, Level level) 方法,我们以可以为一个或几个包设置Log等级. 比如,我们可以为Logging包设置Log 等级为FINE,以下是配置代码:

    LogManager.getLogManager().setLevel("logging", Level.FINE)
    

    1.7. 最佳实践
    通常记录的日志时候要为每个类使用类全名,这样,开发者可以很容易的定位每个信息的来源。这也是官方文档里所推荐的一个使用方法。

    2. 实例
    首先,创建一个自己的格式类:

    package logging;
    
    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;
    
    class MyHtmlFormatter extends Formatter
    {
    	// 格式化日志
    	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("");
    			buf.append(rec.getLevel());
    			buf.append("");
    		} 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);
    	}
    
    	//输出头部
    	public String getHead(Handler h)
    	{
    		return "<HTML>\n<HEAD>\n" + (new Date()) + "\n</HEAD>\n<BODY>\n<PRE>\n"
    				+ "<table border>\n  "
    				+ "<tr><th>Time</th><th>Log Message</th></tr>\n";
    	}
    
    	//输出尾部
    	public String getTail(Handler h)
    	{
    		return "</table>\n  </PRE></BODY>\n</HTML>\n";
    	}
    }
    

    其次,初始化Logger:

    package logging;
    
    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 {
    		// 创建Logger
    		Logger logger = Logger.getLogger("");
    		logger.setLevel(Level.INFO);
    		fileTxt = new FileHandler("Logging.txt");
    		fileHTML = new FileHandler("Logging.html");
    
    		// 创建文档格式者
    		formatterTxt = new SimpleFormatter();
    		fileTxt.setFormatter(formatterTxt);
    		logger.addHandler(fileTxt);
    
    		//创建HTML格式者
    		formatterHTML = new MyHtmlFormatter();
    		fileHTML.setFormatter(formatterHTML);
    		logger.addHandler(fileHTML);
    	}
    }
    

    最后,使用Logger:

    package logging;
    
    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class UseLogger {
    	//使用类名,这样改名时可以自动重构
    	private final static Logger LOGGER = Logger.getLogger(UseLogger.class.getName());
    
    	public void writeLog() {
    		// 设置等级为Severe, 只有Severe等级的日志被记录
    		LOGGER.setLevel(Level.SEVERE);
    		LOGGER.severe("Info Log");
    		LOGGER.warning("Info Log");
    		LOGGER.info("Info Log");
    		LOGGER.finest("Really not important");
    
    		//设置等级为Severe,  severe, warning and info等级的日志都被记录
    		// Finest将不被记录
    		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 logger = new UseLogger();
    		try {
    			MyLogger.setup();
    		} catch (IOException e) {
    			e.printStackTrace();
    			throw new RuntimeException("Problems with creating the log files");
    		}
    		logger.writeLog();
    	}
    }
    

    您可能也喜欢

    与大家分享点什么吧: