update 2019/5/18:贴个Logging撑撑门面 (¦3____]
本实验中使用log4j进行输出日志,首先对log4j进行配置,配置文件如下:
图3,.3 log4j.properties配置文件
可以看到,在本配置文件中,日志同时被打印到控制台和日志文件,对于DEBUG级别及以上的异常输出到debug.log,对于ERROR级别及以上的日志输出到error.log。其中ConversionPattern决定日志打印格式,日志文件采用了比较容易识别的格式,这里也方便了下一步的日志查询。
- 在所有可能抛出错误的类中声明一个Logger,对于每一个可能抛出的错误,在抛错的同时使用logger.error打印ERROR级别日志。异常错误的发生时间、类名、方法名、具体信息都能够在日志文件获得。因为在本实验中针对异常错误的处理方式相同(弹窗显示错误信息提示重新处理)所以异常处理结果不计入日志。
- 在ConcreteCircularOrbit以及其子类中为每一种轨道操作使用logger.info打印INFO级别日志。
日志查询的基本思想如下:首先设计一个日志处理配LogParser,这个类提供读取日志文件以及筛选日志的功能。
读入文件时,因为log4j针对不同天的日志分别产生后缀名不同的日志文件,再读入的时候需要将这些日志全部读入,对于每一条日志,使用正则表达式获得日志基本信息(与日志文件输出格式匹配),设置类LogItem对日志基本信息进行存储,存放到LogParser的一个List中。
筛选日志时,根据提供的可用条件在List中筛选满足条件的所有日志,并整合成易于阅读的格式打印。
具体日志查询功能如下:
图3.4 查看日志功能演示
对于时间,起始时间以及终止时间都需要满足能够配Instant.parse正常解析的格式,中间使用 , 分隔。如2019-05-16T09:02:04Z,2019-05-16T09:38:39Z,如果输入错误,则提示错误信息。
图3.5 根据时间筛选日志
package otherDirectory.logparser;
import java.time.Instant;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class LogItem {
String logType; //log类型
String reason;
String className; //类名
String methodName; //方法名
Instant time; //时间
public LogItem(String line) {
String regex = "TYPE\\((.*)\\) TIME\\((.*)\\) METHOD\\(:(.*)\\.(.*)\\(.*\\)\\) REASON\\((.*)\\)";
Matcher matcher = Pattern.compile(regex).matcher(line);
if(matcher.find()) {
logType = matcher.group(1);
className = matcher.group(3);
methodName = matcher.group(4);
reason = matcher.group(5);
String timeStr = matcher.group(2);
time = Instant.parse(timeStr.replace(' ','T')+"Z");
}
}
@Override
public String toString() {
return String.format("[类型]\t%s%n[类名]\t%s%n[方法名]\t%s%n[时间]\t%s%n[详细信息]\t%s%n%n",
logType,className,methodName,time,reason);
}
public String getLogType() {
return logType;
}
public String getReason() {
return reason;
}
public String getClassName() {
return className;
}
public String getMethodName() {
return methodName;
}
public Instant getTime() {
return time;
}
}
package otherDirectory.logparser;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
* 日志文件解析类
*/
public class LogParser {
// static String LOGPATH = "out/debug.log";
List<LogItem> logItemList = new ArrayList<>();
public LogParser() {
loadLogFile();
}
public void loadLogFile() {
BufferedReader reader = null;
File outFile = new File("out/");
List<String> debugfiles = new ArrayList<>();
if(outFile.exists()) {
File[] arrayFile = outFile.listFiles();
if(arrayFile==null) return ;
for(File tfile:arrayFile) {
if(tfile.isFile()) {
if(tfile.getName().startsWith("debug.log")) {
debugfiles.add(tfile.getPath());
}
}
}
}
try {
for(String debugFile:debugfiles) {
// reader = new BufferedReader(new FileReader(new File(LOGPATH)));
InputStreamReader isr = new InputStreamReader(new FileInputStream(debugFile), StandardCharsets.UTF_8);
reader = new BufferedReader(isr);
String line = reader.readLine();
while (line != null) {
if (line.length() == 0) {
line = reader.readLine();
continue;
}
logItemList.add(new LogItem(line.trim()));
line = reader.readLine();
}
try {
reader.close();
isr.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}catch(IOException e) {
e.printStackTrace();
}
logItemList.sort((x,y)->{return x.getTime().compareTo(y.getTime());});
}
int logCount;
public String getFilterLogs(Predicate<LogItem> predicate) {
List<LogItem> logs = logItemList.stream()
.filter(predicate)
.collect(Collectors.toList());
StringBuilder sb = new StringBuilder();
logs.forEach(sb::append);
logCount=logs.size()*6;
return sb.toString();
}
public int getLogCount() {
return this.logCount;
}
public List<String> getAllClassNames() {
Set<String> classnames = new HashSet<>();
logItemList.forEach(it->classnames.add(it.className));
return new ArrayList<>(classnames);
}
public List<String> getAllMethodNames() {
Set<String> methodnames = new HashSet<>();
logItemList.forEach(it->methodnames.add(it.methodName));
return new ArrayList<>(methodnames);
}
public List<String> getAllETypes() {
Set<String> etypes = new HashSet<>();
logItemList.forEach(it->etypes.add(it.logType));
return new ArrayList<>(etypes);
}
}
我是迷人的小尾巴
以下外链,利益相关,欢迎浏览ε≡٩(๑>₃<)۶ :