Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms
自3月25至今,已经好久没有写学习日志了,今天在写日志抓取合并的小方法,发现抓取后的日志并米有依据系统执行的日志顺序排序。日志抓取排列逻辑如下:
- 通过日志标识,从各个日志文件(例如 use.log,error.log 等)中获取所需日志列表
- 合并日志列表
- 升序排序
- 输出日志报告
结果最后获取日志信息后,发现实际产出结果与预期结果不相符,如下所示:
-- ::, - 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地址...
通过日志可以发现,排序时起决定作用的日志时间影响较大,系统运算速度越快,产生相同时间开头的日志就越多,因而影响了最终的排序结果。
如何才能解决呢?我想出了如下的解决方案:
- 将所有的日志信息统一输出到一个文件中,只需要依次获取日志输出即可
- 创建自己的日志模块取代 log4j
- 日志排序打标,即:在每个日志字符串前添加一个唯一 ID,通过此 ID 进行排序
- 二次编译 log4j 的源码在 debug、info、warn、error、fatal 方法中添加延时
再三思索下,决定采用第四种解决方案。原因如下:
- 所有日志信息输出到同一文件,日志文件较大,且不符合日志分类习惯
- 耗时较长(主要是有很多开源的日志构件,自己再开发,觉得浪费时间,哈哈哈)
- 日志打标需要在每个日志输出的地方添加标识,因方法或语句块会被多次执行,此方案直接KO
- 省时省力,只是需要牺牲点时间(个人觉得此方案比其他方案会更优)
经过查询 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的更多相关文章
- java学习-GET方式抓取网页(UrlConnection和HttpClient)
抓取网页其实就是模拟客户端(PC端,手机端...)发送请求,获得响应数据documentation,解析对应数据的过程.---自己理解,错误请告知 一般常用请求方式有GET,POST,HEAD三种 G ...
- Android全局异常处理 实现自己定义做强制退出和carsh日志抓取
在做android项目开发时,大家都知道都会遇到程序报错或者Anr异常,会弹出来一个强制退出的弹出框,对于开发人员是好事,但是对于用户体验和 UI实在毫无违和感,别说用户接受不了,就连我们自己本身可能 ...
- adb命令 logcat日志抓取
一.logcat抓log方法:adb logcat命令,可以加条件过滤 1.安装SDK(参考android sdk环境安装) 2.使用数据线链接手机,在手机助手的sdcard中建立一个1.log的文件 ...
- adb logcat日志抓取
adb命令 logcat日志抓取 一.logcat抓log方法:adb logcat命令,可以加条件过滤 1.安装SDK(参考android sdk环境安装) 2.使用数据线链接手机,在手机助手的sd ...
- 用libvlc 抓取解码后的帧数据
vlc是一套优秀的开源媒体库,其特点是提供了完整的流媒体框架, 用它可以非常方便的实现抓取解码帧的功能. 与此功能有关的关键API为 libvlc_video_set_callbacks /*设置回调 ...
- c#抓取网页内容乱码的解决方案
写过爬虫的同学都知道,这是个很常见的问题了,一般处理思路是: 使用HttpWebRequest发送请求,HttpWebResponse来接收,判断HttpWebResponse中”Content-Ty ...
- JAVA使用Gecco爬虫 抓取网页内容(附Demo)
JAVA 爬虫工具有挺多的,但是Gecco是一个挺轻量方便的工具. 先上项目结构图. 这是一个 JAVASE的 MAVEN 项目,要添加包依赖,其他就四个文件.log4j.properties 加上三 ...
- java网络爬虫----------简单抓取慕课网首页数据
© 版权声明:本文为博主原创文章,转载请注明出处 一.分析 1.目标:抓取慕课网首页推荐课程的名称和描述信息 2.分析:浏览器F12分析得到,推荐课程的名称都放在class="course- ...
- Java广度优先爬虫示例(抓取复旦新闻信息)
一.使用的技术 这个爬虫是近半个月前学习爬虫技术的一个小例子,比较简单,怕时间久了会忘,这里简单总结一下.主要用到的外部Jar包有HttpClient4.3.4,HtmlParser2.1,使用的开发 ...
随机推荐
- 限制Boltzmann机(Restricted Boltzmann Machine)
起源:Boltzmann神经网络 Boltzmann神经网络的结构是由Hopfield递归神经网络改良过来的,Hopfield中引入了统计物理学的能量函数的概念. 即,cost函数由统计物理学的能量函 ...
- Ninject使用demo
public class HomeController : Controller { public ActionResult Index() { //核心对象 IKernel ninjectKerne ...
- java枚举使用详解
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集” ...
- 多态(Java)
一.多态 1.什么是多态? 解析:不同的对象对于同一个操作,做出的响应不同 具有表现多种形态的能力的特征 2.使用多态的优点 解析:为了实现统一调用 一个小例子:<父类类型作为参数> 父类 ...
- Java 多继承
浅浅地上了几天 Java 的课程,然后怎么也想不明白:Java 不支持多继承有和接口到底是什么样的关系? 一只牛的故事. // 叫的抽象基类 abstract class call{ } // 跑的抽 ...
- Hadoop.2.x_简单的测试文件读取与上传
代码如下, 后备参考: package com.bigdata.hadoop.hdfs; import java.io.File; import java.io.FileInputStream; im ...
- php+curl上传文件
因为公司项目用java做的,需要我这边用php上传文件.只给了个接口,参数都不明确,然后这边不提交表单,在生成pdf之后就立马上传.用了php+curl,总是没上传成功,这里看到了篇文章http:// ...
- 注入语句详解(get注入,cookie注入,搜索型注入等)
注意:对于普通的get注入,如果是字符型,前加' 后加 and ''=' 拆半法 ###################################### and exists (select ...
- zju(2)vivi的配置编译和固化
1.实验目的 熟悉vivi的知识和应用并使用交叉编译平台vivi引导并烧写到目标板. 二.实验内容 1. 在Ubuntu下配置vivi并进行交叉编译: 2. 将编译好的vivi烧写到目标板上. 三.主 ...
- SPFA导读及介绍(转载)
适用范围:给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了. 我们约定有向加权图G不存在负权回路,即最短路径一 ...