0
Java logging快速教程
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 类是用来定义什么程度的日志必须被记录。日志等级分为:
除了以上这些等级之外,还有等级 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();
}
}