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

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

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

 -- ::, - INFO  - [main] [cn.ffp.autotest.api.report.ReportHelper:] - [] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | -- :: | 是】概要报告 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.report.ReportHelper:] - [] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | -- :: | 是】概要报告 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.report.ReportHelper:] - [] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | -- :: | 是】断言报告 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.report.ReportHelper:] - [] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | -- :: | 是】断言报告 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.report.ReportHelper:] - [] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | -- :: | 是】请求响应报告 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.report.ReportHelper:] - [] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | -- :: | 是】请求报告 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.report.ReportHelper:] - [] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | -- :: | 是】请求报告 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.report.ReportHelper:] - [] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | -- :: | 是】请求参数报告 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.report.ReportHelper:] - [] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | -- :: | 是】请求参数报告 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.report.ReportHelper:] - [] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | -- :: | 是】请求主体报告 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.report.ReportHelper:] - [] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | -- :: | 是】请求主体报告 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.report.ReportHelper:] - [] 开始生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | -- :: | 是】日志报告 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.report.ReportHelper:] - [] 成功生成【Test_001_001 | 首页接口-导航栏配置 | 范丰平 | -- :: | 是】请求响应报告 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.util.IpUtils:] - [] 成功获取主机IP地址...
-- ::, - INFO - [main] [cn.ffp.autotest.api.util.IpUtils:] - [] 成功获取主机IP地址...
-- ::, - INFO - [main] [cn.ffp.autotest.api.util.IpUtils:] - [] 开始通过主机域名【mb.ffp.com】获取对应的地址对象 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.util.IpUtils:] - [] 成功通过主机域名【mb.ffp.com】获取对应的地址对象 ...
-- ::, - INFO - [main] [cn.ffp.autotest.api.util.IpUtils:] - [] 开始获取主机IP地址...
-- ::, - INFO - [main] [cn.ffp.autotest.api.util.IpUtils:] - [] 开始获取主机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 文件中添加引用即可。

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

 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 | 是】概要报告 ...
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 | 是】概要报告 ...
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 | 是】断言报告 ...
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 | 是】断言报告 ...
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 | 是】请求报告 ...
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 | 是】请求参数报告 ...
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 | 是】请求参数报告 ...
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 | 是】请求主体报告 ...
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 | 是】请求主体报告 ...
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 | 是】请求报告 ...
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 | 是】请求响应报告 ...
2016-04-10 23:08:01,205 - INFO - [main] [cn.ffp.autotest.api.util.IpUtils:98] - [1460300877526] 开始获取主机IP地址...
2016-04-10 23:08:01,215 - INFO - [main] [cn.ffp.autotest.api.util.IpUtils:108] - [1460300877526] 成功获取主机IP地址...
2016-04-10 23:08:01,225 - INFO - [main] [cn.ffp.autotest.api.util.IpUtils:192] - [1460300877526] 开始通过主机域名【mb.ffp.com】获取对应的地址对象 ...
2016-04-10 23:08:01,235 - INFO - [main] [cn.ffp.autotest.api.util.IpUtils:197] - [1460300877526] 成功通过主机域名【mb.ffp.com】获取对应的地址对象 ...
2016-04-10 23:08:01,245 - INFO - [main] [cn.ffp.autotest.api.util.IpUtils:98] - [1460300877526] 开始获取主机IP地址...
2016-04-10 23:08:01,255 - INFO - [main] [cn.ffp.autotest.api.util.IpUtils:108] - [1460300877526] 成功获取主机IP地址...
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 | 是】请求响应报告 ...
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 | 是】日志报告 ...
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 的您一份参考。

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

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

  1. java学习-GET方式抓取网页(UrlConnection和HttpClient)

    抓取网页其实就是模拟客户端(PC端,手机端...)发送请求,获得响应数据documentation,解析对应数据的过程.---自己理解,错误请告知 一般常用请求方式有GET,POST,HEAD三种 G ...

  2. Android全局异常处理 实现自己定义做强制退出和carsh日志抓取

    在做android项目开发时,大家都知道都会遇到程序报错或者Anr异常,会弹出来一个强制退出的弹出框,对于开发人员是好事,但是对于用户体验和 UI实在毫无违和感,别说用户接受不了,就连我们自己本身可能 ...

  3. adb命令 logcat日志抓取

    一.logcat抓log方法:adb logcat命令,可以加条件过滤 1.安装SDK(参考android sdk环境安装) 2.使用数据线链接手机,在手机助手的sdcard中建立一个1.log的文件 ...

  4. adb logcat日志抓取

    adb命令 logcat日志抓取 一.logcat抓log方法:adb logcat命令,可以加条件过滤 1.安装SDK(参考android sdk环境安装) 2.使用数据线链接手机,在手机助手的sd ...

  5. 用libvlc 抓取解码后的帧数据

    vlc是一套优秀的开源媒体库,其特点是提供了完整的流媒体框架, 用它可以非常方便的实现抓取解码帧的功能. 与此功能有关的关键API为 libvlc_video_set_callbacks /*设置回调 ...

  6. c#抓取网页内容乱码的解决方案

    写过爬虫的同学都知道,这是个很常见的问题了,一般处理思路是: 使用HttpWebRequest发送请求,HttpWebResponse来接收,判断HttpWebResponse中”Content-Ty ...

  7. JAVA使用Gecco爬虫 抓取网页内容(附Demo)

    JAVA 爬虫工具有挺多的,但是Gecco是一个挺轻量方便的工具. 先上项目结构图. 这是一个 JAVASE的 MAVEN 项目,要添加包依赖,其他就四个文件.log4j.properties 加上三 ...

  8. java网络爬虫----------简单抓取慕课网首页数据

    © 版权声明:本文为博主原创文章,转载请注明出处 一.分析 1.目标:抓取慕课网首页推荐课程的名称和描述信息 2.分析:浏览器F12分析得到,推荐课程的名称都放在class="course- ...

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

    一.使用的技术 这个爬虫是近半个月前学习爬虫技术的一个小例子,比较简单,怕时间久了会忘,这里简单总结一下.主要用到的外部Jar包有HttpClient4.3.4,HtmlParser2.1,使用的开发 ...

随机推荐

  1. Kalman滤波器原理和实现

    Kalman滤波器原理和实现 kalman filter Kalman滤波器的直观理解[1] 假设我们要测量一个房间下一刻钟的温度.据经验判断,房间内的温度不可能短时大幅度变化,也就是说可以依经验认为 ...

  2. mysql的关于TABLE_SCHEMA的sql语句和nformation_schema表

    1.查询sjcenter数据库里开头为sj_demo和sj_onlyinv的所有表的总条数 select sum(table_rows) from (select table_name,table_r ...

  3. UVA 393

    The Doors Description You are to find the length of the shortest path through a chamber containing o ...

  4. BZOJ3226[Sdoi2008]校门外的区间 题解

    题目大意: 有5种运算维护集合S(S初始为空)并最终输出S. 5种运算如下: U T  S∪T I T S∩T D T  S-T C T T-S S T S⊕T 基本集合运算如下: A∪B {x : ...

  5. 应用程序间跳转 (友盟SSO 授权 与系统自带的分享)

    应用程序间跳转的应用场景 使用第三方用户登录,如微信登录,返回用户名和密码 需要用户授权,返回到调用程序,同时返回授权的用户名 应用程序推广,跳转到itunes并显示指定app下载页 第三方支付,跳转 ...

  6. Kosaraju 算法

    Kosaraju 算法 一.算法简介 在计算科学中,Kosaraju的算法(又称为–Sharir Kosaraju算法)是一个线性时间(linear time)算法找到的有向图的强连通分量.它利用了一 ...

  7. 【POJ3461】Olipo

    Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...

  8. HDU 5877 dfs+ 线段树(或+树状树组)

    1.HDU 5877  Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...

  9. Centos 开放80端口

    一.添加规则 #/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT #/sbin/iptables -I INPUT -p tcp --dport ...

  10. Linux多线程实例练习 - pthread_cancel()

    Linux多线程实例练习 - pthread_cancel 1.代码 xx_pthread_cancel.c #include <pthread.h> #include <stdio ...