羿先生的学习笔记[4]: Java中的logging工具
一、日志
网络设备、系统及服务程序等,在运作时通常都会产生一个叫log的事件记录;每一行日志都记载着日期、时间、使用者及动作等相关操作的描述。
在我们编写程序的时候,有时也需要记录用户的各种操作、产生的异常和时间,因此需要使用记录日志的工具。常用的日志记录工具有log4j、Java自带的logging等。这篇文章将简略介绍logging工具。
二、logging工具简介
Logger类位于java.util.logging下,使用时需导入相应的包。
Logger类可以用于向控制台、文件等输出日志内容,需要配合Handler类实现。Logger类可输出七种输出等级的信息。这些内容将在下文详细说明。获得一个初始化的Logger需要调用静态方法Logger.getLogger(),可以用其向控制台输出默认的固定格式的日志。
Logger logger = Logger.getLogger("log");
System.out.println("hello world");
logger.info("hello world");
运行得到结果如图:

可以看出,日志输出了时间、记录发生的具体位置、记录的等级(信息)和具体的信息。
三、logging的具体使用方法
1. 七种输出等级
上文提到,Logger类可以输出七种输出等级的信息,按严重程度从高到低分别为:SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST,输出对应等级的信息需要调用Logger类中对应的方法:

需要注意的是,Logger中的每一个Handler(下文详细介绍)都有一个等级,默认为INFO。如果通过调用低于这一等级的方法输出信息,信息是不会被该Handler输出的。
Logger logger = Logger.getLogger("log");
System.out.println("hello world");
logger.severe("hello world severe");
logger.warning("hello world warning");
logger.info("hello world info");
logger.config("hello world config");
logger.fine("hello world fine");
logger.finer("hello world finer");
logger.finest("hello world finest");
得到运行结果

可见控制台中只输出了SEVERE, WARING, INFO等级的信息,而低于INFO等级的信息则未被输出。
2. Handler
我们在上文提到,Logger记录日志需要配合Handler实现。常用的Handler有ConsoleHandler和FileHandler,分别对应向控制台输出日志与向文件中输出日志。在Handler中,可以设置输出的格式与输出信息的最低等级,除七种上文提到过的等级外,还可以使用OFF等级屏蔽所有等级信息的输出,或是使用ALL等级输出所有等级的信息。
例子如下:
Logger logger = Logger.getLogger("log");
try {
FileHandler fileHandler = new FileHandler("src/log test.log");//日志文件路径
//获取当前时间
Calendar now = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
fileHandler.setFormatter(new Formatter() {
@Override
public String format(LogRecord logRecord) {
//设置格式:记录时间 记录信息 记录等级
return sdf.format(now.getTime()) + " " + logRecord.getMessage() + " " + logRecord.getLevel() + '\n';
}
});
//设置记录信息的最低等级
fileHandler.setLevel(Level.WARNING);
logger.addHandler(fileHandler);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("hello world");
logger.info("hello world info");
logger.warning("hello world warning");
控制台输出:

在指定的路径下可以发现一个新生成的日志文件

内容如下:

输出到控制台的Handler是getLogger返回的Logger中自带的。但如果我们不希望将日志输出输出控制台或是希望换一种格式输出到控制台呢?
我们可以添加这一语句:
logger.setUseParentHandlers(false);
来禁用掉自带的控制台输出。
如果需要更改控制台输出的格式,我们可以实例化一个新的ConsoleHandler并按此前加入FileHandler方法如法炮制:
Logger logger = Logger.getLogger("log");
logger.setUseParentHandlers(false);
//添加FileHandler
try {
FileHandler fileHandler = new FileHandler("src/log test.log");//日志文件路径
//获取当前时间
Calendar now = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
fileHandler.setFormatter(new Formatter() {
@Override
public String format(LogRecord logRecord) {
//设置格式:记录时间 记录信息 记录等级
return sdf.format(now.getTime()) + " " + logRecord.getMessage() + " " + logRecord.getLevel() + '\n';
}
});
//设置记录信息的最低等级
fileHandler.setLevel(Level.WARNING);
logger.addHandler(fileHandler);
} catch (IOException e) {
e.printStackTrace();
}
//添加ConsoleHandler
ConsoleHandler consoleHandler = new ConsoleHandler();
//获取当前时间
Calendar now = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
consoleHandler.setFormatter(new Formatter() {
@Override
public String format(LogRecord logRecord) {
//设置格式:记录时间 记录信息 记录等级
return sdf.format(now.getTime()) + " " + logRecord.getMessage() + " " + logRecord.getLevel() + '\n';
}
});
//设置记录信息的最低等级
consoleHandler.setLevel(Level.INFO);
logger.addHandler(consoleHandler);
System.out.println("hello world");
logger.info("hello world info");
logger.warning("hello world warning");
运行得到控制台输出:

可见已按我们指定的方式输出了记录信息。
4万+

被折叠的 条评论
为什么被折叠?



