Java util Logger是java原生的日志生成工具,不需要另外引用类库,使用方便,学习简单,能够在小型应用中灵活使用。下面从实际应用角度,对Logger的使用步骤作出总结,以实现快速掌握。
Logger的使用一般包括以下几个步骤:
一、 定义全局的Logger,在不同的类中共用
关键语句:
Logger myLogger = Logger.getLogger("com.mycompany.myapp");
方法参数是Logger的名称,当名称相同时候,同一个名称的Logger只创建一个,实现各个类中共享。
二、 设定输出媒介控制器(Handler)
共有四步:
- 一般日志输出包括调试时输出到控制台,以及程序运行时输出到文件,因此Handler包括了控制台ConsoleHandler以及文件FileHandler。
- Handler输出的日志格式为默认格式,系统提供的格式包括SimpleFormatter、XMLFormatter等,输出的内容一般比较冗余,不满足使用,最好使用自定义内容输出格式,可使用派生自Formatter类的自定义子类。
- 设定Handler的输出等级,默认是info级。
- 将Handler加入到Logger中。
关键语句:
//创建consoleHandler 自定义类实例,用于在控制台发送日志
ConsoleHandler consoleHandler = new ConsoleHandler();
//设置consoleHandler实例输出格式
consoleHandler.setFormatter(new ConsoleLogFormatter());
//加入到Logger中
myLogger.addHandler(consoleHandler);
//不显示系统自带的consoleHandler,否则控制台将发出两条同样的日志
myLogger.setUseParentHandlers(false);
//在工程目录下创建log文件夹
File dir = new File("log");
if(!dir.exists() || !dir.isDirectory())
dir.mkdir();
//创建fileHandler 自定义类实例,用于在文件保存日志
FileHandler fileHandler = new
FileHandler("log\\myapp.%u.%g.txt",1000,2,true);
fileHandler.setFormatter(new FileLogFormatter());
fileHandler.setLevel(Level.INFO);
myLogger.addHandler(fileHandler);
说明 :
- 创建日志文件前,若没有文件夹,log将会报错,因此在写入日志文件前,检查文件夹是否存在,不存在则创建文件夹。
- FileHandler fileHandler = new FileHandler("log\myapp.%u.%g.txt",1000,2,true);
语句意义为:新建FileHandler,地址为工程文件路径下;log\myapp.%u.%g.txt,循环文件编号为%u.%g,文件最大1000字节,2个文件循环,是否追加文件为“是”,否则总为新建文件。 - myLogger.setUseParentHandlers(false);
语句意义为:系统自带的consoleHandler设置为不生效,仅生效增加的自定义consoleHandler,否则控制台将发出两条同样的日志。
三、 Logger设置输出等级,并输出日志
关键语句:
myLogger.setLevel(Level.INFO);
myLogger.info("一般信息1 ");
myLogger.info("一般信息2 ");
完整的程序代码为:
public class LogProduce {
public static void main(String[] args) throws IOException {
Logger myLogger = Logger.getLogger("com.mycompany.myapp");
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setFormatter(new ConsoleLogFormatter());
myLogger.addHandler(consoleHandler);
myLogger.setUseParentHandlers(false);
File dir = new File("log");
if(!dir.exists() || !dir.isDirectory())
dir.mkdir();
FileHandler fileHandler = new FileHandler("log\\myapp.%u.%g.txt",1000,2,true);
fileHandler.setFormatter(new FileLogFormatter());
fileHandler.setLevel(Level.INFO);
myLogger.addHandler(fileHandler);
myLogger.setLevel(Level.INFO);
myLogger.info("一般信息1 ");
myLogger.info("一般信息2 ");
LogUser logUser1 = new LogUser();
logUser1.produceLog();
}
}
实际输出为;
Console输出:
![](https://img.haomeiwen.com/i4943455/36c124814442eb28.jpg)
文件输出:
![](https://img.haomeiwen.com/i4943455/3ae956449113b689.png)
四、补充说明
- ConsoleLogFormatter 和 FileLogFormatter 两个派生的 Formatter 子类
public class FileLogFormatter extends Formatter {
public FileLogFormatter(){
super();
}
@Override
public String format(LogRecord r) {
Date date = new Date();
String sDate = date.toString();
String lineSperator = System.getProperty("line.separator");
StringBuilder sb = new StringBuilder();
sb.append("[" + sDate + "]" + "[" + r.getLevel() +"]");
sb.append(r.getMessage());
//在一条日志结束后采用常量方式的系统换行符,因为 “\n” 形式可能不识别
sb.append(lineSperator);
return sb.toString();
}
}
该子类重写了format方法,用于用户自定义输出,使用StringBuilder类拼装。
关键语句:
String lineSperator = System.getProperty("line.separator");
若直接在格式字符串中插入传统换行符“\n",在输出文件中可能不能识别,因此采用系统定义的换行符 line.separator。
类似的,ConsoleLogFormatter代码为:
public class ConsoleLogFormatter extends Formatter {
public ConsoleLogFormatter(){
super();
}
@Override
public String format(LogRecord r) {
String lineSperator = System.getProperty("line.separator");
StringBuilder sb = new StringBuilder();
sb.append(r.getMessage());
sb.append(lineSperator);
return sb.toString();
}
}
- 子类中调用Logger
在子类中调用getLogger即可。
public class LogUser {
Logger myLogger = Logger.getLogger("com.mycompany.myapp");
public void produceLog(){
myLogger.info("LogUser.produceLog");
}
网友评论