从事项目开发,日志模块是一个不可或缺的功能模块,可以说没有日志功能的项目是不完整的!而日志功能既可以方便项目调试、定位错误,更重要的是可以对数据做简要分析。对日志处理的主流方式有两种:写入数据库和写入日志文件。Logback写入数据库的实现可以参考我的博客《Logback写入MySQL的源码扩展》,今天和大家分享如何使用Logback进行日志文件的读写操作。
一、项目准备
新建一个Java项目,需要导入的依赖包和项目目录结构图如下:
二、配置和编码
①给logback.xml做如下配置:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<property name="logRoot" value="D:/logback/" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logRoot}%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>5</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{"yyyy-MM-dd HH:mm:ss"} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="ALL">
<appender-ref ref="FILE"/>
</root>
</configuration>
②为读取日志文件封装实体类Log:
package com.ldl.logback;
public class Log {
private String time;
private String level;
private String source;
private String detail;
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
@Override
public String toString() {
return "[time=" + time + ", level=" + level + ", source=" + source + ", detail=" + detail + "]";
}
}
③编写文件读写的方法:
package com.ldl.logback;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {
final static Logger logger = LoggerFactory.getLogger(Test.class);
public static void main(String[] args) throws Exception{
// generateLogs();
List<Log> list = getLogsFromFiles("D:\\logback\\2018-11-04.log");
for (Log log : list) {
System.out.println(log);
}
}
public static void generateLogs() {
for(int i=0;i<5;i++) {
logger.trace("trace -- "+i);
logger.debug("debug -- "+i);
logger.info("info -- "+i);
logger.warn("warn -- "+i);
logger.error("error -- "+i);
}
}
public static List<Log> getLogsFromFiles(String filePath) throws FileNotFoundException{
List<Log> logsList = new ArrayList<Log>();
File file = new File(filePath);
if (file.exists() && file.isFile()) {
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
String lineOfFile = null;
try {
while ((lineOfFile = bufferedReader.readLine()) !=null) {
Log log = new Log();
if (lineOfFile==null || lineOfFile.length() < 19) {
return null;
}
String time = lineOfFile.substring(0, 19);
String level = (lineOfFile.substring(lineOfFile.indexOf("]")+2, lineOfFile.indexOf("]")+7)).trim();
String source = lineOfFile.substring(lineOfFile.indexOf(level) + level.length() + 2, lineOfFile.indexOf(" - "));
String detail = lineOfFile.substring(lineOfFile.indexOf(" - ")+3);
log.setTime(time);
log.setLevel(level);
log.setSource(source);
log.setDetail(detail);
logsList.add(log);
}
} catch (IOException e) {
e.printStackTrace();
}
}
return logsList;
}
}
三、测试效果
①文件写入:
②文件读取(用于管理系统展示日志):