论文系统Step1:从日志记录中提取特定信息

前言

论文数据需要,需要实现从服务器日志中提取出用户的特定交互行为信息。日志内容如下:

自己需要获取“请求数据包一行的信息”及“OUTSTR”下一行的信息。

思路

考虑使用正则表达式提取特定信息。

示例代码:

Pattern pattern = Pattern.compile("请求数据包信息:\"(.+?)\"");
Matcher matcher = pattern.matcher("请求数据包信息:\"index.html\"");
if(matcher.find())
  System.out.println(matcher.group(1));

考虑到日志中数据格式特点,利用上述方式并不可行。不过还是应该考虑使用正则解决以上问题。

初步处理后的文档内容如下:

分析以上信息,需要进一步进行处理,将每个用户的信息进行单独抽取并存入到数据库中。 作为实验,先单独获取一用户的数据。但是由于服务端返回数据无任何用户标识,而且返回信息无任何交易标识,仍需添加。需要对日志做进一步的处理操作。添加信息如下:

通过将json格式的字符串转换为json对象。并获取到指定信息,如下所示:

为了提取出每个用户的交互序列,实现方法如下:将日志中的交互序列按照用户ID分别建立相应的文件夹。将同一用户的请求与输出信息输出到同一用户ID的文件内。内容如下:

文件内容如下:

通过分析分类后的文件内容,可以发现,由于存在某些耗时交易,故会出现多个请求、输出交叉显示的情况。

针对这种情况,在服务端返回信息中加入了uid,tx_code信息,如下所示:

那么就需要将服务端返回信息与请求信息进行配对操作。

考虑到交易的混合,服务端返回信息的混合,必须假设一种理想情况之下的处理。否则,处理起来过于费劲。

{“phone”:“18353102068”}

{“result”:登陆结果}

{“classid”:分类编号}

{“pcnt”:返回数量}

{“shopid”:药店编号}

{“pcnt”:返回数量}

{null}

{“data”:广告详情}

{“advid”:广告编号}

{“url”:广告链接}

{null}

{"addrs":[{"receiver":"孙华强","tel":"18853883586","addr":"北京市北京市朝阳区112号","addrid":1}]}

{"old_billid":"","addrid":"1","shopid":"S18853883587","msg":"","yhhdid":"YH00000019","yhhdamt":2,"yhqid":"","yhqcnt":0,"yhqamt":0,"cnt":4,"meddata":[{"medid":"TH20013063","medcnt":1,"cfid":""},{"medid":"TZ44021940","medcnt":1,"cfid":""},{"medid":"TH10940251","medcnt":1,"cfid":""},{"medid":"TB20020918","medcnt":1,"cfid":""}]

{"billid":"LM201605163586476"}

注意其中的输入输出参数是经过筛选之后提取出来的。为此需要写一个工具类,用来提取特定的输入输出参数。

测试情景1:

输入:整理后的单用户日志

18353102068:1002-->9002-->9002-->9002-->9005-->1004-->3002

输出:静态统计表、动态统计表

测试情景2:

输入:整理后的多用户日志

18353102068:1002-->9002-->9002-->9002-->9005-->1004-->3002

18353102066:1002-->9002-->9005-->1004-->3002

输出:静态统计表、动态统计表

测试情景3:

输入:整理后的包含匿名用户日志

18353102068:1002-->9002-->9002-->9002-->9005-->1004-->3002

18353102066:1002-->9002-->9005-->1004-->3002

$tempuser:9002-->9005-->9101-->9103

输出:静态统计表、动态统计表

测试情景4:

输入:整理后的交叉请求案例日志

输出:静态统计表、动态统计表

测试情景5:

输入:整理后的单用户多阶段日志

注:测试需在case长度至少为2的情况下进行。

18353102068:1002-->9002-->9002

18353102068:1002

输出:静态统计表、动态统计表

测试情景6:

输入:整理后的多用户多阶段日志

注:测试需在case长度至少为2的情况下进行。

18353102068:1002(2016-05-16 11:27:45)-->9002-->9002(2016-05-16 11:27:47)

18353102066:1002(2016-05-16 12:27:45)-->1004-->3002(2016-05-16 12:37:54)

18353102068:1002(2016-05-17 11:27:45)

-->9002-->9002-->9002-->9005-->1004-->3002(2016-05-17 11:27:54)

18353102066:1002(2016-05-17 11:27:45)

-->9002->9005-->1004-->3002(2016-05-17 11:27:54)

输出:静态统计表、动态统计表

测试情景7:

输入:整理后的包含匿名用户多阶段日志

注:测试需在case长度至少为2的情况下进行。

1.18353102068:1002(2016-05-16 11:27:45)-->9002-->9002(2016-05-16 11:27:47)

2.18353102066:1002(2016-05-16 12:27:45)-->1004-->3002(2016-05-16 12:37:54)

3.18353102068:1002(2016-05-17 11:27:45)

-->9002-->9002-->9002-->9005-->1004-->3002(2016-05-17 11:27:54)

4.18353102066:1002(2016-05-17 11:27:45)

-->9002->9005-->1004-->3002(2016-05-17 11:27:54)

5.$tempuser:9002(2016-05-17 11:35:54)-->9005-->9101-->9103(2016-05-17 11:39:54)

6.18353102066:1002(2016-05-17 12:27:45)-->1004-->3002(2016-05-17 12:37:54)

7.$tempuser:9002(2016-05-17 12:35:54)-->9101-->9103(2016-05-17 12:39:54)

输出:静态统计表、动态统计表

测试情景8:

输入:实际用户日志

问题

 

查看日志内容:

receiver:{"version":"1.0","fore_time":"2016-05-16 20:21:04","uid":"$tempuser","tx_code":"1001"}

receiver:{"version":"1.0","fore_time":"2016-05-16 20:21:22","uid":"$tempuser","tx_code":"1002"}

实际日志中居然出现了上面的请求信息。1001为注册交易应该对应参数“phone”和“passwd”,但请求中并未包含,这是什么原因?

交易1001(注册)、1002(登录)均涉及到加密传输,在逻辑上可以解释以上现象。移动端1001(注册交易)代码如下:

var data = {};
appCallServer($http, "1001", data, function(data) {
$ionicLoading.hide();
var key = data.publickey;
// 在此调用测试加密
var passwd = password; // 用户密码提交至此
data = {
"phone": phonenum, // 用户名提交至此
"passwd": MyRsaEncrypt(key, passwd)
};
appCallServer($http, "1001", data, function(data) {
if (data.result == "0000") {
$ionicLoading.show({
template: "注册成功"
});
$timeout(function() {
$ionicLoading.hide();
$scope.gotoLogin(phonenum, password);
}, 1000);
}
});
}, function(data) {
$ionicLoading.show({
template: data.errtext
});
$timeout(function() {
$ionicLoading.hide();
}, 1000);
});

客户端实现的业务逻辑是首先调用一次1001(此次请求参数为空),获取到服务端返回的公钥后,利用此公钥对用户所输入的密码进行加密操作。再次调用1001(此次请求参数为phone,passwd),完成用户的注册。1002逻辑同此。至此,以上问题得到了解释。

为此,通过更改服务端逻辑:在1001,1002调用之前使用0000获取公钥,这样就符合了自己的筛选规则:去除0000。

     if(b.contains("result") && !"0000".equals(tx_code)){....}

整理后的日志中不会再出现1001、1002均不会存在不存在“phone”参数的现象。

注:在进行实际日志测试的时候遇到了瓶颈,交易紊乱,输入输出紊乱问题尤为突出。难道是生成日志方式有问题?

$tempuser:1001(2016-05-16 20:21:04)-->9101-->9103(2016-05-17 12:39:54)

18353102068:9104(2016-05-16 11:27:10)-->9101-->9002(2016-05-16 11:27:47)

输出:静态统计表、动态统计表

未完待续.....

参考文献

1.http://blog.csdn.net/sunhuaqiang1/article/details/47169913

2.http://www.bejson.com/

美文美图

论文系统Step1:从日志记录中提取特定信息的更多相关文章

  1. 如何从Serilog请求日志记录中排除健康检查终结点

    这是在ASP.NET Core 3.X中使用Serilog.AspNetCore系列文章的第四篇文章:. 第1部分-使用Serilog RequestLogging减少日志详细程度 第2部分-使用Se ...

  2. Python之向日志输出中添加上下文信息

    除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如:远程客户端的IP地址和用户名.这里我们 ...

  3. 【转】Python之向日志输出中添加上下文信息

    [转]Python之向日志输出中添加上下文信息 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定 ...

  4. Python 日志输出中添加上下文信息

    Python日志输出中添加上下文信息 除了传递给日志记录函数的参数(如msg)外,有时候我们还想在日志输出中包含一些额外的上下文信息.比如,在一个网络应用中,可能希望在日志中记录客户端的特定信息,如: ...

  5. python中提取位图信息(AttributeError: module 'struct' has no attribute 'unstack')

    前言 今天这篇博文有点意思,它是从一个例子出发,从而体现出在编程中的种种细节和一些知识点的运用.和从前一样,我是人,离成神还有几十万里,所以无可避免的出现不严谨的地方甚至错误,请酌情阅读. 0x00 ...

  6. 【BioCode】Elm格式中提取位点信息

    说明: ①Elm格式: PLMD ID    Uniprot Accession    Position     Type     Sequence   Species    PMIDsPlMD编号 ...

  7. 在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)

    前一阵子我们介绍了如何启动Scrapy项目以及关于Scrapy爬虫的一些小技巧介绍,没来得及上车的小伙伴可以戳这些文章: 手把手教你如何新建scrapy爬虫框架的第一个项目(上) 手把手教你如何新建s ...

  8. jquery实现对象数组 筛选出每条记录中的特定属性字段 及根据某个属性值筛选出指定的元素

    jquery实现对象数组 筛选出每条记录中的特定属性字段 直接上图: 源码: /** * 对后端返回的数据,筛选出符合报表的列项,多余的列项去除 */ function filterParams(da ...

  9. ResquestInfoServlet类通过访问HttpServletRequest对象的各种方法来读取HTTP请求中的特定信息,并且把它们写入到HTML中

    ResquestInfoServlet类通过访问HttpServletRequest对象的各种方法来读取HTTP请求中的特定信息,并且把它们写入到HTML中 ResquestInfoServlet.j ...

随机推荐

  1. 如何用Netty实现一个轻量级的HTTP代理服务器

    为什么会想通过Netty构建一个HTTP代理服务器?这也是笔者发表这篇文章的目的所在. 其主要还是源于解决在日常开发测试过程中,一直困扰测试同学很久的一个问题,现在我就来具体阐述一下这个问题. 在日常 ...

  2. 解决 APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tas

    报错信息:APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 在网上查了一下,大部分网友分析是c ...

  3. QRCode.js:使用 JavaScript 生成二维码

    什么是 QRCode.js? QRCode.js 是一个用于生成二维码的 JavaScript 库.主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库. 基本用法 ...

  4. Cannot change version of project facet Dynamic Web Module to 2.5的解决

    步骤1 右键项目 点击Project Facets 修改里面的 Dynamic Web Module 成2.5 maven-update看下有没有解决 步骤2 没有就导入 <dependency ...

  5. 安装Leanote极客范的云笔记

    前言 在这个互联网知识呈爆炸增长的时代,作为一个程序员要掌握的知识越来越多,然再好的记性也不如烂笔头,有了笔记我们就是可以时常扒拉扒拉以前的知识,顺便可以整理下自己的知识体系. 如今市面上云笔记产品, ...

  6. 阿里架构师带你深入浅出jvm

    本文跟大家聊聊JVM的内部结构,从组件中的多线程处理,JVM系统线程,局部变量数组等方面进行解析 JVM JVM = 类加载器(classloader) + 执行引擎(execution engine ...

  7. WSGI及gunicorn指北(一)

    作为一个Python Web 开发工程师,pyg0每天都喜滋滋的写着基于各种web框架的业务代码. 突然有一天,技术老大过来跟pyg0说,嘿,我们要新上线一个服务,你来帮我部署一下吧.不用太复杂.用g ...

  8. Hibernate异常之Integer转float(自动类型转换错误)

    错误代码: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Float at org.hiber ...

  9. 安卓高级 特效动画ExplosionField和 SmoothTransition

    本教程所有图片为github上的所无法正常访问请科学上网 SmoothTransition 展示效果 github:源码地址 使用方法 你能通过一行代码使用上面所有的动画 @Override prot ...

  10. Eclipse调试(1)——基础篇

    作为使用Eclipse的程序员都会使用它的Debug.但是有不少人只会用F6.F8,其他功能知之甚少.今天我就来总结一下我在使用eclipse的debug时的一些个人经验.水平有限,不足之处还请赐教. ...