Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms

自3月25至今,已经好久没有写学习日志了,今天在写日志抓取合并的小方法,发现抓取后的日志并米有依据系统执行的日志顺序排序。日志抓取排列逻辑如下:

  1. 通过日志标识,从各个日志文件(例如 use.log,error.log 等)中获取所需日志列表
  2. 合并日志列表
  3. 升序排序
  4. 输出日志报告

结果最后获取日志信息后,发现实际产出结果与预期结果不相符,如下所示:

 1 2016-04-10 22:54:23,042 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:151] - [1460300059732] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】概要报告 ...
 2 2016-04-10 22:54:23,042 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:167] - [1460300059732] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】概要报告 ...
 3 2016-04-10 22:54:23,042 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:187] - [1460300059732] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】断言报告 ...
 4 2016-04-10 22:54:23,042 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:211] - [1460300059732] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】断言报告 ...
 5 2016-04-10 22:54:23,042 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:286] - [1460300059732] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求响应报告 ...
 6 2016-04-10 22:54:23,042 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:358] - [1460300059732] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求报告 ...
 7 2016-04-10 22:54:23,042 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:392] - [1460300059732] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求报告 ...
 8 2016-04-10 22:54:23,042 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:409] - [1460300059732] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求参数报告 ...
 9 2016-04-10 22:54:23,042 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:426] - [1460300059732] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求参数报告 ...
10 2016-04-10 22:54:23,042 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:441] - [1460300059732] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求主体报告 ...
11 2016-04-10 22:54:23,042 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:446] - [1460300059732] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求主体报告 ...
12 2016-04-10 22:54:24,102 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:261] - [1460300059732] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】日志报告 ...
13 2016-04-10 22:54:24,102 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:338] - [1460300059732] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求响应报告 ...
14 2016-04-10 22:54:24,102 - INFO  - [main] [cn.ffp.autotest.api.util.IpUtils:108] - [1460300059732] 成功获取主机IP地址...
15 2016-04-10 22:54:24,102 - INFO  - [main] [cn.ffp.autotest.api.util.IpUtils:108] - [1460300059732] 成功获取主机IP地址...
16 2016-04-10 22:54:24,102 - INFO  - [main] [cn.ffp.autotest.api.util.IpUtils:192] - [1460300059732] 开始通过主机域名【mb.ffp.com】获取对应的地址对象 ...
17 2016-04-10 22:54:24,102 - INFO  - [main] [cn.ffp.autotest.api.util.IpUtils:197] - [1460300059732] 成功通过主机域名【mb.ffp.com】获取对应的地址对象 ...
18 2016-04-10 22:54:24,102 - INFO  - [main] [cn.ffp.autotest.api.util.IpUtils:98] - [1460300059732] 开始获取主机IP地址...
19 2016-04-10 22:54:24,102 - INFO  - [main] [cn.ffp.autotest.api.util.IpUtils:98] - [1460300059732] 开始获取主机IP地址...

通过日志可以发现,排序时起决定作用的日志时间影响较大,系统运算速度越快,产生相同时间开头的日志就越多,因而影响了最终的排序结果。

如何才能解决呢?我想出了如下的解决方案:

  1. 将所有的日志信息统一输出到一个文件中,只需要依次获取日志输出即可
  2. 创建自己的日志模块取代 log4j
  3. 日志排序打标,即:在每个日志字符串前添加一个唯一 ID,通过此 ID 进行排序
  4. 二次编译 log4j 的源码在 debug、info、warn、error、fatal 方法中添加延时

再三思索下,决定采用第四种解决方案。原因如下:

  1. 所有日志信息输出到同一文件,日志文件较大,且不符合日志分类习惯
  2. 耗时较长(主要是有很多开源的日志构件,自己再开发,觉得浪费时间,哈哈哈)
  3. 日志打标需要在每个日志输出的地方添加标识,因方法或语句块会被多次执行,此方案直接KO
  4. 省时省力,只是需要牺牲点时间(个人觉得此方案比其他方案会更优)

经过查询 log4j 的api 发现,上述日志方法在 org\apache\log4j\Category.java 文件中,具体延时时间依据实际需要自行酌情设置即可,添加或修改如下所示代码(info、warn、error、fatal 方法参考修改即可):

package org.apache.log4j;

import org.apache.log4j.spi.AppenderAttachable;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.LoggerRepository;
import org.apache.log4j.spi.HierarchyEventListener;
import org.apache.log4j.helpers.NullEnumeration;
import org.apache.log4j.helpers.AppenderAttachableImpl;

import java.util.Enumeration;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Vector;

public class Category implements AppenderAttachable {

    /**
     * Aaron.ffp 2016-04-10 add log delay time 10ms
     * reference:debug、info、warn、error、fatal
     */
    protected long              delay    = 10;

    public void debug(Object message) {
        try {
            Thread.sleep(delay);
        } catch (InterruptedException e) {
        }

        if (repository.isDisabled(Level.DEBUG_INT))
            return;
        if (Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel())) {
            forcedLog(FQCN, Level.DEBUG, message, null);
        }
    }

    public void debug(Object message, Throwable t) {
        try {
            Thread.sleep(delay);
        } catch (InterruptedException e) {
        }

        if (repository.isDisabled(Level.DEBUG_INT))
            return;
        if (Level.DEBUG.isGreaterOrEqual(this.getEffectiveLevel()))
            forcedLog(FQCN, Level.DEBUG, message, t);
    }
}

  下载 log4j-1.2.17.jar ,对其进行反编译(不会的请参阅我之前写的文章:Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)),然后打包上传到私服,在 pom 文件中添加引用即可。

重新执行测试用例,得到的日志数据如下所示(此时获取的日志结果为期望结果,同时从日志中也可看出我们的日志延时输出已经生效):

 1 2016-04-10 23:08:01,005 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:151] - [1460300877526] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】概要报告 ...
 2 2016-04-10 23:08:01,015 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:167] - [1460300877526] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】概要报告 ...
 3 2016-04-10 23:08:01,025 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:187] - [1460300877526] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】断言报告 ...
 4 2016-04-10 23:08:01,035 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:211] - [1460300877526] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】断言报告 ...
 5 2016-04-10 23:08:01,045 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:358] - [1460300877526] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求报告 ...
 6 2016-04-10 23:08:01,055 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:409] - [1460300877526] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求参数报告 ...
 7 2016-04-10 23:08:01,065 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:426] - [1460300877526] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求参数报告 ...
 8 2016-04-10 23:08:01,075 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:441] - [1460300877526] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求主体报告 ...
 9 2016-04-10 23:08:01,085 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:446] - [1460300877526] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求主体报告 ...
10 2016-04-10 23:08:01,095 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:392] - [1460300877526] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求报告 ...
11 2016-04-10 23:08:01,105 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:286] - [1460300877526] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求响应报告 ...
12 2016-04-10 23:08:01,205 - INFO  - [main] [cn.ffp.autotest.api.util.IpUtils:98] - [1460300877526] 开始获取主机IP地址...
13 2016-04-10 23:08:01,215 - INFO  - [main] [cn.ffp.autotest.api.util.IpUtils:108] - [1460300877526] 成功获取主机IP地址...
14 2016-04-10 23:08:01,225 - INFO  - [main] [cn.ffp.autotest.api.util.IpUtils:192] - [1460300877526] 开始通过主机域名【mb.ffp.com】获取对应的地址对象 ...
15 2016-04-10 23:08:01,235 - INFO  - [main] [cn.ffp.autotest.api.util.IpUtils:197] - [1460300877526] 成功通过主机域名【mb.ffp.com】获取对应的地址对象 ...
16 2016-04-10 23:08:01,245 - INFO  - [main] [cn.ffp.autotest.api.util.IpUtils:98] - [1460300877526] 开始获取主机IP地址...
17 2016-04-10 23:08:01,255 - INFO  - [main] [cn.ffp.autotest.api.util.IpUtils:108] - [1460300877526] 成功获取主机IP地址...
18 2016-04-10 23:08:01,265 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:338] - [1460300877526] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】请求响应报告 ...
19 2016-04-10 23:08:01,275 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:261] - [1460300877526] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】日志报告 ...
20 2016-04-10 23:08:01,305 - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:266] - [1460300877526] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | 2016-03-29 00:03:34 | 是】日志报告 ... 

至此, Java学习-046-测试日志抓取合并、排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms 顺利完结,希望此文能够给初学 Java 的您一份参考。

最后,非常感谢亲的驻足,希望此文能对亲有所帮助。热烈欢迎亲一起探讨,共同进步。非常感谢! ^_^

时间: 2024-10-01 04:29:16

Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms的相关文章

[Android]Android日志抓取软件测试

1. log文件分类简介 1. 实时打印: 1.1 logcat main(应用程序) -- adb logcat -b main -v time > app.log 1.2 logcat radio(射频相关-SIMSTK,modem相关的ATcommand) -- adb logcat -b radio -v time > radio.log 1.3 logcat events(系统事件的日志,比如触屏事件等) -- adb logcat -b events -v time 1.4 tcp

Java广度优先爬虫示例(抓取复旦新闻信息)

一.使用的技术 这个爬虫是近半个月前学习爬虫技术的一个小例子,比较简单,怕时间久了会忘,这里简单总结一下.主要用到的外部Jar包有HttpClient4.3.4,HtmlParser2.1,使用的开发工具(IDE)为intelij 13.1,Jar包管理工具为Maven,不习惯用intelij的同学,也可以使用eclipse新建一个项目. 二.爬虫基本知识 1.什么是网络爬虫?(爬虫的基本原理) 网络爬虫,拆开来讲,网络即指互联网,互联网就像一个蜘蛛网一样,爬虫就像是蜘蛛一样可以到处爬来爬去,把

adb命令 logcat日志抓取

一.logcat抓log方法:adb logcat命令,可以加条件过滤 1.安装SDK(参考android sdk环境安装) 2.使用数据线链接手机,在手机助手的sdcard中建立一个1.log的文件或在抓日志时直接导出到电脑位置 3.程序运行cmd,进入到含有adb.exe目录 4.输入adb devices 查看设备是否连上 5.输入抓取命令: 存放到手机 adb logcat -s *:E > /mmt/sdcard/1.log 存放到PC adb logcat -s '*:E' > d

adb logcat日志抓取

adb命令 logcat日志抓取 一.logcat抓log方法:adb logcat命令,可以加条件过滤 1.安装SDK(参考android sdk环境安装) 2.使用数据线链接手机,在手机助手的sdcard中建立一个1.log的文件或在抓日志时直接导出到电脑位置 3.程序运行cmd,进入到含有adb.exe目录 4.输入adb devices 查看设备是否连上 5.输入抓取命令: 存放到手机 adb logcat -s *:E > /mmt/sdcard/1.log 存放到PC adb log

用libvlc 抓取解码后的帧数据

vlc是一套优秀的开源媒体库,其特点是提供了完整的流媒体框架, 用它可以非常方便的实现抓取解码帧的功能. 与此功能有关的关键API为 libvlc_video_set_callbacks /*设置回调,用来抓取解码后的帧*/ libvlc_video_set_format /*设置解码帧的格式 yuv or rgba ?*/ 这个函数将三个函数指针作为参数 /*callback function, lock the shared memory, and tell vlc where to put

JAVA使用Gecco爬虫 抓取网页内容

JAVA 爬虫工具有挺多的,但是Gecco是一个挺轻量方便的工具. 先上项目结构图. 这是一个 JAVASE的 MAVEN 项目,要添加包依赖,其他就四个文件.log4j.properties 加上三个java类. 1.先配置log4j.properties log4j.rootLogger = error,stdout,D,E log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Targe

Java爬虫,信息抓取的实现

转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/23272657 今天公司有个需求,需要做一些指定网站查询后的数据的抓取,于是花了点时间写了个demo供演示使用. 思想很简单:就是通过Java访问的链接,然后拿到html字符串,然后就是解析链接等需要的数据. 技术上使用Jsoup方便页面的解析,当然Jsoup很方便,也很简单,一行代码就能知道怎么用了: [java] view plaincopy Document doc = J

Java模拟新浪微博登陆抓取数据

前言:  兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先:  要想登陆新浪微博需要预登陆,即是将账号base64加密,密码rsa加密以及请求http://login.sina.com.cn/sso/prelogin.php链接获取一些登陆需要参数,返回的接送字符串如: {"retcode":0,"servertime":1487292003,&quo

(转)Java爬虫,信息抓取的实现

转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/23272657 今天公司有个需求,需要做一些指定网站查询后的数据的抓取,于是花了点时间写了个demo供演示使用. 思想很简单:就是通过Java访问的链接,然后拿到html字符串,然后就是解析链接等需要的数据. 技术上使用Jsoup方便页面的解析,当然Jsoup很方便,也很简单,一行代码就能知道怎么用了: [java] view plaincopyprint? Document d