序言:
1.在软件构造实验四中,要求为 实验三中的程序中添加一个日志,来记录每一步的操作种类等等,以及记录记录错误发生时间,错误类型和异常发生时间,异常类型。由于以前从未接触过日志文件 的方法,所以进行了初步的学习,了解了log4j和 logger 语言之后,使用更加简单易懂的logger 进行日志的添加。
日志:
网络设备、系统及服务程序等,在运作时通常都会产生一个叫log的事件记录;每一行日志都记载着日期、时间、使用者及动作等相关操作的描述。
在我们编写程序的时候,有时也需要记录用户的各种操作、产生的异常和时间,因此需要使用记录日志的工具。常用的日志记录工具有log4j、Java自带的logging等。这篇文章将简略介绍logging工具
logger使用简介
1.logger的分级
logger的常用级别,全部定义在java.util.logging.Level里面。
各级别按降序排列如下:
**SEVERE(最高值)
WARNING
INFO
CONFIG
FINE
FINER
FINEST(最低值)
**此外,还有一个级别 OFF,可用来关闭日志记录,使用级别 ALL 启用所有消息的日志记录。
logger默认的级别是INFO,比INFO更低的日志将不显示。
Logger的默认级别定义是在jre安装目录的lib下面。
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");
运行结果:
Logger中的每一个Handler(下文详细介绍)都有一个等级,默认为INFO。如果通过调用低于这一等级的方法输出信息,信息是不会被该Handler输出的。
2.创建一个Logger对象
为指定子系统查找或创建一个 logger
static Logger getLogger(String name)
为指定子系统查找或创建一个 logger。
static Logger getLogger(String name, String resourceBundleName)
注意:name是Logger的名称,当名称相同时候,同一个名称的Logger只创建一个。
3. Handler
Handler 对象从 Logger 中获取日志信息,并将这些信息导出。例如,它可将这些信息写入控制台或文件中,也可以将这些信息发送到网络日志服务中,或将其转发到操作系统日志中。
可通过执行 setLevel(Level.OFF) 来禁用 Handler,并可通过执行适当级别的 setLevel 来重新启用。
Handler 类通常使用 LogManager 属性来设置 Handler 的 Filter、Formatter 和 Level 的默认值。
举例说明:
控制台控制器: 在控制台中打印日志文件
ConsoleHandler consoleHandler =new ConsoleHandler();
consoleHandler.setLevel(Level.ALL);
log.addHandler(consoleHandler);
文件控制器:单独设置文件 打印日志
//文件控制器
FileHandler fileHandler = new FileHandler("F:/testDir/8888g.log");
fileHandler.setLevel(Level.INFO);
log.addHandler(fileHandler);
4.Formatter
如果使用上文中的代码直接讲handler添加进入log得话,那么输出的日志的形式是以默认的方式输出
如下图
这时需要用到fomatter来为Log设定 特定形式的日志输出,方便用户提取信息。
Formatter 为格式化 LogRecords 提供支持。
一般来说,每个日志记录 Handler 都有关联的 Formatter。Formatter 接受 LogRecord,并将它转换为一个字符串。
有些 formatter(如 XMLFormatter)需要围绕一组格式化记录来包装头部和尾部字符串。可以使用 getHeader 和 getTail 方法来获得这些字符串。
LogRecord 对象用于在日志框架和单个日志 Handler 之间传递日志请求。
LogRecord(Level level, String msg)用给定级别和消息值构造 LogRecord。
例如:
fileHandler.setFormatter(new Formatter() {//定义一个匿名类
@Override
public String format(LogRecord record) {
return sdf.format(now.getTime()) + record.getMessage()+ ":"+record.getLevel()+"\n";
}
});
注: sdf.format括号中得格式 按照自己需要进行编写
这样就可以指定格式得将日志输出到文件中。
5.实际使用过程
(1)创建Logger对象,创建可以是在要记录日志的类中,如果想要在全局的app中定义一个日志,可以单独创建一个类
类得构造方法:
private Logger log;
private FileHandler fileHandler;
public CreateLog(String Name,String Path){
log = Logger.getLogger(Name);
try {
fileHandler = new FileHandler(Path);
}catch(IOException e){
System.out.println("找不到文件!");
}
log.addHandler(fileHandler);
}
用以上的创建方式,在app中想要创建一个日志文件,可以直接 以路径作为参数,直接将日志存在指定路径的txt中。
(2)为这个类创建添加日志的方法
针对不同的添加日志的情况编写不同的方法:
比如 记录app的操作日志,和记录app的报错日志,以及程序得异常日志 就可以写成同一日志类下的三种不同方法,这两种方法中为fileHandler设定了不同的日志等级
public void logAction(String message, String type) throws IOException {
log.setLevel(Level.INFO);
fileHandler.setLevel(Level.INFO);
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 record) {
return sdf.format(now.getTime()) + record.getMessage()+ ":"+record.getLevel()+"\n";
}
});
System.out.println("日志记录:操作:INFO"+ " <" + message + ">" + "<"+type+">");
log.log(Level.INFO,"<" + message + ">" + "<"+type+">");
}
先在方法中设定级别 ,再设置时间,使用Calendar 来获取当前系统时间,最后再设定特定格式setFormatter 以文件得形式输出日志。
方法调用:
在app程序中,先将 日志类 delegate到 app类中:
private CreateLog alog = new CreateLog("姓名","路径");
之后在每一个操作时可以直接调用方法
alog.logAction("信息1","信息2");
以上为创建一个简单日志的大致流程。