TP5日志Kafka接收Java正则解析

项目需要对企业的业务访问流量进行大数据分析,由于使用Kafka+flume采集数据,接收到的数据是单条的所以需要组装切割再筛选所需要的数据。

正则初级入门

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”)。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。正则表达式是繁琐的,但它是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真阅读本教程,加上应用的时候进行一定的参考,掌握正则表达式不是问题。

推荐初入门的朋友看看:https://www.runoob.com/regexp/regexp-tutorial.html

TP5日志动态分割

通过观察TP5的日志是很有规律的,每次请求的结尾都有横线分隔,所以可以一个分割线接收完整的日志片段,如:

1
2
3
4
5
6
7
8
--------------------------------------------------------------- #分隔线
[ 2019-05-27T10:56:02+08:00 ] 192.168.2.243 GET /Ticket2018/index/index/index.html
[ sql ] [ DB ] CONNECT:[ UseTime:0.011552s ] mysql:host=localhost;port=3306;dbname=tptick;charset=utf8
[ sql ] [ SQL ] SHOW COLUMNS FROM `tp_admin_adsimg` [ RunTime:0.047415s ]
[ sql ] [ SQL ] SELECT `savepath`,`savename` FROM `tp_admin_adsimg` WHERE `sta` = 0 ORDER BY ctime desc LIMIT 5 [ RunTime:0.000583s ]
[ sql ] [ SQL ] SHOW COLUMNS FROM `tp_admin_news` [ RunTime:0.018854s ]
[ sql ] [ SQL ] SELECT `id`,`newstite`,`newtime` FROM `tp_admin_news` WHERE `sta` = 0 ORDER BY ctime desc LIMIT 5 [ RunTime:0.000745s ]
---------------------------------------------------------------

正则表达是分解

  • \[([^\[\]]+)\]
  • [.+?\]

筛选包含某字符串的中括号内容

  • [.(?=key).+?\]

字符串以中括号为结尾,获取之前的字符串

  • (?=\[([^\[\]]+)\])

不包含某字符串

  • ((?!.*?ico|png|jpg|jepg|css|js).)

IP地址筛选

  • \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}

需要的正则表达式

1
2
3
4
5
6
# 获取包括两个大括号,第二个括号的关键字是PARAM
\[([^\[\]]+)\].\[.(?=HEADER).+?\].+?(?=\[([^\[\]]+)\])
# 获取两个大括号之间的内容
\[([^\[\]]+)\].\[([^\[\]]+)\].+?(?=\[([^\[\]]+)\])
# 获取包含时间 ip 请求方法的数据
\[([^\[\]]+)\].\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}.((?=.*?GET|POST).)..((?!.*?ico|png|jpg|jepg|css|js).).+?(?=\[([^\[\]]+)\])

Java 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 正则类
public class RegUtil {
/*
* 原始:\[([^\[\]]+)\].\[.(?=PARAM).+?\].+?(?=\[([^\[\]]+)\])
* 描述:依据tp5日志格式,通过关键字获取相应数据
* @params key 需要获得的字符串数据关键字
* */
public static String getDataByKey(String key){
if(key.isEmpty() || key.equals("")){
key = "HEADER";
}
String str = "\\[([^\\[\\]]+)\\].\\[.(?="+key+").+?\\].+?(?=\\[([^\\[\\]]+)\\])";
return str;
}
/*
* 原始:\[([^\[\]]+)\].\[([^\[\]]+)\].+?(?=\[([^\[\]]+)\])
* 描述:依据两个中括号原则获取内容:包括中括号里边的和后边的内容
* */
public static String getLogByBracket = "\\[([^\\[\\]]+)\\].\\[([^\\[\\]]+)\\].+?(?=\\[([^\\[\\]]+)\\])";
/*
* 原始:\[([^\[\]]+)\].\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}.((?=.*?GET|POST).)..((?!.*?ico|png|jpg|jepg|css|js).).+?(?=\[([^\[\]]+)\])
* 描述:获取访问的资源及访问时间访问IP等数据 和访问的地址
* */
public static String postDateUrl = "\\[([^\\[\\]]+)\\].\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}.((?=.*?POST|GET).).((?!.*?ico|png|jpg|jepg|css|js).).+?(?=\\[([^\\[\\]]+)\\])";
public static String getDateUrl = "\\[([^\\[\\]]+)\\].\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}.((?=.*?GET|POST).).((?!.*?ico|png|jpg|jepg|css|js).).+?(?=\\[([^\\[\\]]+)\\])";
}
# 正则分析
sb.append(text);
if(text.contains("---------------------------------------------------------------")){
//System.out.println("组合数据:"+sb.toString()+"\n");
String userAgent = "";
if(sb.toString().length() >8){
Pattern p3 = Pattern.compile(RegUtil.getDateUrl);
Matcher matcher = p3.matcher(sb.toString());
while (matcher.find()) {
userAgent = matcher.group();
System.out.println("Reg时间数据:"+userAgent+"\n");
}
Pattern p4 = Pattern.compile(RegUtil.getDataByKey("HEADER"));
Matcher matcher1 = p4.matcher(sb.toString());
while (matcher1.find()) {
String userAgent1 = matcher1.group();
System.out.println("Reg头数据:"+userAgent1+"\n");
}
}
sb = new StringBuilder();
}

调用结果

1
2
Reg时间数据:[ 2019-05-29T15:33:53+08:00 ] 10.1.1.35 10.1.3.165 GET /clog/index.html
Reg头数据:[ info ] [ HEADER ] array ( 'host' => '10.1.1.35', 'connection' => 'keep-alive', 'upgrade-insecure-requests' => '1',

×

谢谢客官

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 正则初级入门
  2. 2. TP5日志动态分割
  3. 3. 正则表达是分解
    1. 3.1. 筛选包含某字符串的中括号内容
    2. 3.2. 字符串以中括号为结尾,获取之前的字符串
    3. 3.3. 不包含某字符串
    4. 3.4. IP地址筛选
  4. 4. 需要的正则表达式
  5. 5. Java 代码
  6. 6. 调用结果
,