项目需要对企业的业务访问流量进行大数据分析,由于使用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 ] ---------------------------------------------------------------
正则表达是分解
筛选包含某字符串的中括号内容
字符串以中括号为结尾,获取之前的字符串
不包含某字符串
((?!.*?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',
<
Flume增量采集Mysql数据
Hive安装与配置
>