HIT 软件构造2019春 Lab4 Logging部分

update 2019/5/18:贴个Logging撑撑门面  (¦3____]

    1. Logging
      1. 写日志

本实验中使用log4j进行输出日志,首先对log4j进行配置,配置文件如下:

       图3,.3 log4j.properties配置文件

 

可以看到,在本配置文件中,日志同时被打印到控制台和日志文件,对于DEBUG级别及以上的异常输出到debug.log,对于ERROR级别及以上的日志输出到error.log。其中ConversionPattern决定日志打印格式,日志文件采用了比较容易识别的格式,这里也方便了下一步的日志查询。

  1. 在所有可能抛出错误的类中声明一个Logger,对于每一个可能抛出的错误,在抛错的同时使用logger.error打印ERROR级别日志。异常错误的发生时间、类名、方法名、具体信息都能够在日志文件获得。因为在本实验中针对异常错误的处理方式相同(弹窗显示错误信息提示重新处理)所以异常处理结果不计入日志。
  2. 在ConcreteCircularOrbit以及其子类中为每一种轨道操作使用logger.info打印INFO级别日志。
      1. 日志查询

日志查询的基本思想如下:首先设计一个日志处理配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);
    }

}

 

                                                   我是迷人的小尾巴


以下外链,利益相关,欢迎浏览ε≡٩(๑>₃<)۶ :

济南江鹏工贸有限公司山东济南机械加工),济南彤昌机械科技有限公司山东济南机械加工

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值