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

时间:2022-09-10 09:49:10

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

前言

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

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

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

思路

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

示例代码:

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

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

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

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

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

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

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

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

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

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

文件内容如下:

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

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

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

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

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

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

{“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

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

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

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

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

测试情景2:

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

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

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

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

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

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

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

测试情景3:

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

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

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

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

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

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

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

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

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

测试情景4:

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

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

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

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

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

测试情景5:

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

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

18353102068:1002-->9002-->9002

18353102068:1002

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

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

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

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

测试情景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)

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

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

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

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

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

测试情景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)

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

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

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

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

测试情景8:

输入:实际用户日志

问题

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

查看日志内容:

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)

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

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

未完待续.....

参考文献

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

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

美文美图

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

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

论文系统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. WAMPserver配置(允许外部访问、phpmyadmin设置为输入用户名密码才可登录等)

    对于很多不熟悉PHP环境安装的朋友来说,用集成环境可以更快的上手,更方便的搭建PHP的运行环境,但是,WAMP的集成环境仅仅是将底层基础工作做好 了,有些个别关键的配置操作并没有集成到环境安装中,所以 ...

  2. Ubuntu 14.04 AMD 64位 下 Android Studio 的安装

    Ubuntu 14.04 AMD 64位 下 Android Studio 的安装 作者:yoyoyosiyu 邮箱:yoyoyosiyu@163.com 时间:2015年8月25日 Android ...

  3. Tensorflow tflearn 编写RCNN

    两周多的努力总算写出了RCNN的代码,这段代码非常有意思,并且还顺带复习了几个Tensorflow应用方面的知识点,故特此总结下,带大家分享下经验.理论方面,RCNN的理论教程颇多,这里我不在做详尽说 ...

  4. 浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】

    原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在h ...

  5. checkbox:获取所有已选中的值

    /**获取选中的checkbox值*/ function getChecked(){ var ids = ""; $("input:checkbox[name='id'] ...

  6. JAVA开发环境搭建(Mac)

    1. 打开Terminal, 执行命令: java -version 即可查看到我们所安装的jdk版本. 2.安装jdk成功之后,我们还需要配置jdk环境变量. 使用命令: /usr/libexec/ ...

  7. Mysql AVG() 值 返回NULL而非空结果集

    [1]select 查询返回一行NULL 先来模拟复现一下遇到的问题. (1)源数据表grades,学生成绩表 (2)查询SQL语句 查询‘080601’班的各门课平均成绩 SELECT sClass ...

  8. vim 批量替换使用说明

    基本语法: :[addr]s/源字符串/目的字符串/[option] 全局替换命令: :%s/源字符串/目的字符串/g [addr] 表示检索范围,省略时表示当前行. "1,20" ...

  9. Double.parseDouble(String s)

    要把字符串转换为Double类型,只能转换“0.02”这种格式的字符串,不能转换百分比格式的,比如“2%” 这个时候可以Double cbl= Double.parseDouble(“2%”.repl ...

  10. shelve模块(二十三)

    shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写; key必须为字符串,而值可以是python所支持的数据类型 用的比较少 目的: 将字典写入文件保存起来 i ...