Apache HTTPD和NGINX访问日志解析器

这是一个Logparsing框架,旨在简化Apache HTTPD和NGINX访问日志文件的解析。
基本思想是,您应该能够拥有一个解析器,可以通过简单地告诉该行写入了哪些配置选项来构造该解析器。这些配置选项是访问日志行的架构。
github地址:https://github.com/nielsbasjes/logparser
idea安装插件
Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。

Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。这样就省去了手动重建这些代码的麻烦,使代码看起来更简洁些。
安装步骤:

导入依赖

<dependency><groupId>nl.basjes.parse.httpdlog</groupId><artifactId>httpdlog-parser</artifactId><version>5.2</version>
</dependency>

nginx日志样本
在nginx的conf目录下的nginx.conf文件中可以配置日志打印的格式,如下:

 #log_format  main   '$remote_addr - $remote_user [$time_local] [$msec]     [$request_time] [$http_host] "$request" ''$status $body_bytes_sent "$request_body" "$http_referer" ''"$http_user_agent" $http_x_forwarded_for'

$remote_addr 对应客户端的地址
$remote_user 是请求客户端请求认证的用户名,如果没有开启认证模块的话是值为空。
$time_local 表示nginx服务器时间
$msec 访问时间与时区字符串形式
$request_time 请求开始到返回时间
$http_host 请求域名
$request 请求的url与http协议
$status 请求状态,如成功200
$body_bytes_sent 表示从服务端返回给客户端的body数据大小
$request_body 访问url时参数
$http_referer 记录从那个页面链接访问过来的
$http_user_agent 记录客户浏览器的相关信息
$http_x_forwarded_for 请求转发f过来的地址
$upstream_response_time:从 Nginx 建立连接 到 接收完数据并关闭连接
范例:

125.88.xxx.xx - - [02/Nov/2018:14:28:49 +0800] [1541140129.431] [0.095] [ma.xx.game.com]
"POST /?log3/gameReport HTTP/1.1" 200 358 "type=1&id=NaN" "http://ma.xx.game.com/?log3/gameReport2" "Mozilla/5.0 (Windows NT 6.1;Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36" -

点击日流日志样本

2001-980:91c0:1:8d31:a232:25e5:85d 222.68.172.190 - [05/Sep/2010:11:27:50 +0200] \"GET /images/my.jpg HTTP/1.1\" 404 23617\"http://www.angularjs.cn/A00n\" \"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; nl-nl) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1Safari/533.17.8\" \"jquery-ui-theme=Eggplant; BuI=SomeThing; Apache=127.0.0.1.1351111543699529\" \"beijingshi\"

定义格式化字符串

%u %h %l %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\" \"%{Addr}i\"

使用方式
打印日志格式字符串的所有参数

import nl.basjes.parse.core.Field;import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;public class MyRecord {private final Map<String, String> results = new HashMap<>(32);@Field("STRING:request.firstline.uri.query.*")public void setQueryDeepMany(final String name, final String value) {results.put(name, value);}@Field("STRING:request.firstline.uri.query.img")public void setQueryImg(final String name, final String value) {results.put(name, value);}@Field("IP:connection.client.host")public void setIP(final String value) {results.put("IP:connection.client.host", value);}@Field({"HTTP.QUERYSTRING:request.firstline.uri.query","NUMBER:connection.client.logname","STRING:connection.client.user","TIME.STAMP:request.receive.time","HTTP.URI:request.firstline.uri","BYTESCLF:response.body.bytes","HTTP.URI:request.referer","HTTP.USERAGENT:request.user-agent","TIME.DAY:request.receive.time.day","TIME.HOUR:request.receive.time.hour","TIME.MONTHNAME:request.receive.time.monthname"})public void setValue(final String name, final String value) {results.put(name, value);}public String toString() {StringBuilder sb = new StringBuilder();TreeSet<String> keys = new TreeSet<>(results.keySet());for (String key : keys) {sb.append(key).append(" = ").append(results.get(key)).append('\n');}return sb.toString();}public void clear() {results.clear();}
}
import nl.basjes.parse.core.Parser;
import nl.basjes.parse.core.exceptions.DissectionFailure;
import nl.basjes.parse.core.exceptions.InvalidDissectorException;
import nl.basjes.parse.core.exceptions.MissingDissectorsException;
import nl.basjes.parse.httpdlog.HttpdLoglineParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.util.List;public final class Main {private Main(){}private static final Logger LOG = LoggerFactory.getLogger(Main.class);/*** 打印出来解析后的所有参数* @param logformat* @throws NoSuchMethodException* @throws MissingDissectorsException* @throws InvalidDissectorException*/private void printAllPossibles(String logformat) throws NoSuchMethodException, MissingDissectorsException, InvalidDissectorException {// To figure out what values we CAN get from this line we instantiate the parser with a dummy class// that does not have ANY @Field annotations.Parser<Object> dummyParser= new HttpdLoglineParser<>(Object.class, logformat);List<String> possiblePaths;possiblePaths = dummyParser.getPossiblePaths();// If you want to call 'getCasts' then the actual parser needs to be constructed.// Simply calling getPossiblePaths does not build the actual parser.// Because we want this for all possibilities yet we are never actually going to use this instance of the parser// We simply give it a random method with the right signature and tell it we want all possible pathsdummyParser.addParseTarget(String.class.getMethod("indexOf", String.class), possiblePaths);System.out.println("==================================");System.out.println("Possible output:");for (String path : possiblePaths) {System.out.println(path+"         "+dummyParser.getCasts(path));}LOG.info("==================================");}private void run() throws InvalidDissectorException, MissingDissectorsException, NoSuchMethodException, DissectionFailure {// This format and logline originate from here:// https://stackoverflow.com/questions/20349184/java-parse-log-fileString logformat = "%t %u [%D %h %{True-Client-IP}i %{UNIQUE_ID}e %r] %{Cookie}i %s \"%{User-Agent}i\" \"%{host}i\" %l %b %{Referer}i";String logline = "[02/Dec/2013:14:10:30 -0000] - [52075 10.102.4.254 177.43.52.210 UpyU1gpmBAwAACfd5W0AAAAW GET /SS14-VTam-ny_019.j" +"pg.rendition.zoomable.jpg HTTP/1.1] hsfirstvisit=http%3A%2F%2Fwww.domain.com%2Fen-us||1372268254000; _opt_vi_3FNG8DZU=F870" +"DCFD-CBA4-4B6E-BB58-4605A78EE71A; __ptca=145721067.0aDxsZlIuM48.1372279055.1379945057.1379950362.9; __ptv_62vY4e=0aDxsZlIu" +"M48; __pti_62vY4e=0aDxsZlIuM48; __ptcz=145721067.1372279055.1.0.ptmcsr=(direct)|ptmcmd=(none)|ptmccn=(direct); __hstc=1457" +"21067.b86362bb7a1d257bfa2d1fb77e128a85.1372268254968.1379934256743.1379939561848.9; hubspotutk=b86362bb7a1d257bfa2d1fb77e1" +"28a85; USER_GROUP=julinho%3Afalse; has_js=1; WT_FPC=id=177.43.52.210-1491335248.30301337:lv=1385997780893:ss=1385997780893" +"; dtCookie=1F2E0E1037589799D8D503EB8CFA12A1|_default|1; RM=julinho%3A5248423ad3fe062f06c54915e6cde5cb45147977; wcid=UpyKsQ" +"pmBAwAABURyNoAAAAS%3A35d8227ba1e8a9a9cebaaf8d019a74777c32b4c8; Carte::KerberosLexicon_getWGSN=82ae3dcd1b956288c3c86bdbed6e" +"bcc0fd040e1e; UserData=Username%3AJULINHO%3AHomepage%3A1%3AReReg%3A0%3ATrialist%3A0%3ALanguage%3Aen%3ACcode%3Abr%3AForceRe" +"Reg%3A0; UserID=1356673%3A12345%3A1234567890%3A123%3Accode%3Abr; USER_DATA=1356673%3Ajulinho%3AJulio+Jose%3Ada+Silva%3Ajul" +"inho%40tecnoblu.com.br%3A0%3A1%3Aen%3Abr%3A%3AWGSN%3A1385990833.81925%3A82ae3dcd1b956288c3c86bdbed6ebcc0fd040e1e; MODE=FON" +"TIS; SECTION=%2Fcontent%2Fsection%2Fhome.html; edge_auth=ip%3D177.43.52.210~expires%3D1385994522~access%3D%2Fapps%2F%2A%21" +"%2Fbin%2F%2A%21%2Fcontent%2F%2A%21%2Fetc%2F%2A%21%2Fhome%2F%2A%21%2Flibs%2F%2A%21%2Freport%2F%2A%21%2Fsection%2F%2A%21%2Fw" +"gsn%2F%2A~md5%3D90e73ee10161c1afacab12c6ea30b4ef; __utma=94539802.1793276213.1372268248.1385572390.1385990581.16; __utmb=9" +"4539802.52.9.1385991739764; __utmc=94539802; __utmz=94539802.1372268248.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none);" +" WT_FPC=id=177.43.52.210-1491335248.30301337:lv=1386000374581:ss=1386000374581; dtPC=-; NSC_wtfswfs_xfcgbsn40-41=ffffffff0" +"96e1a1d45525d5f4f58455e445a4a423660; akamai-edge=5ac6e5b3d0bbe2ea771bb2916d8bab34ea222a6a 200 \"Mozilla/5.0 (Windows NT 6." +"2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36\" \"www.domain.com\" - 463952 http://ww" +"w.domain.com/content/report/shows/New_York/KSHK/trip/s_s_14_ny_ww/sheers.html";//打印出来所有参数printAllPossibles(logformat);//定义日志的解析器,传递javabean对象和日志解析规则Parser<MyRecord> parser = new HttpdLoglineParser<>(MyRecord.class, logformat);//实例化javabeanMyRecord record = new MyRecord();System.out.println("==================================================================================");//解析数据,将解析数据后的数据给javabeanparser.parse(record, logline);System.out.println(record.toString());System.out.println("==================================================================================");}public static void main(final String[] args) throws Exception {new Main().run();}}

GitHub--logparser(日志解析器)相关推荐

  1. SPINE:高拓展性、用户友好的自动化日志解析新神器

    编者按:在计算机系统与软件的实践和研究中,可靠性是至关重要且经久不衰的课题.如何自动化地分析日志所记录的系统状态并让数据"说话" ,受到了广泛研究.日志解析是自动化日志分析中的关键 ...

  2. IIS 日志解析,增强 IIS 服务器安全性

    企业严重依赖 Microsoft Internet 信息服务 (IIS) 服务器来托管其网页和 Web 应用程序,以及存储其文件.请务必妥善保护您的 IIS 服务器(包括 Web 和 FTP). 什么 ...

  3. Gson:GitHub 标星 18K 的 JSON 解析器,Google 出品的 Java JSON 解析器,强烈推荐!

    01.前世今生 我叫 Gson,是一款开源的 Java 库,主要用途为序列化 Java 对象为 JSON 字符串,或反序列化 JSON 字符串成 Java 对象.从我的名字上,就可以看得出一些端倪,我 ...

  4. Cascading(一)之日志解析

    此例子为官网例子,所以直接上代码: 1 package com.wyf.cascade; 2 3 import java.util.Properties; 4 5 import cascading.f ...

  5. FTP服务器日志解析

    2019独角兽企业重金招聘Python工程师标准>>> FTP服务器日志解析 FTP是老牌的文件传输协议,在网络中应用非常广泛.本节就Vsftp服务器的日志进行重点讨论,在本书的FT ...

  6. java json解码器_Jackson:我是最牛掰的 Java JSON 解析器(有点虚)

    在当今的编程世界里,JSON 已经成为将信息从客户端传输到服务器端的首选协议,可以好不夸张的说,XML 就是那个被拍死在沙滩上的前浪. 很不幸的是,JDK 没有 JSON 库,不知道为什么不搞一下.L ...

  7. 解析mysqlbinlog日志_关于mysql-binlog日志解析框架

    欢迎广大码农爱好者向我推荐框架,我会择其精要.有趣者分享给大家. 今天下午,有同学献出了一款软件,说是海外澳洲番邦向朕进贡的,于是品尝了一番. 软件名称:mysql-binlog-connector ...

  8. java 解析器_高性能Java解析器实现过程详解

    如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...

  9. Java JSwww88xbocom17176934OOO-N 解析器

    在当今的编程世界里,JSON 已经成为将信息从客户端传输到服务器端的首选协议,可以好不夸张的说,XML 就是那个被拍死在沙滩上的前浪. 很不幸的是,JDK 没有 JSON 库,不知道为什么不搞一下.L ...

最新文章

  1. Windows 10 Visual Studio 2017 安装配置 Apache Thrift (C++)
  2. git reset HEAD^
  3. PMCAFF | 阿里PM的可用性测试秘籍:有理有据的用户体验优化
  4. 弹簧触摸开关原理图_电梯弹簧抱闸调整
  5. (二)元学习算法MAML简介及代码分析
  6. 最新 Bitnami redmine安装与配置
  7. indesign教程,如何设置边距和分栏?
  8. 22.搜索大纲及重定向(Search Synonyms and Re-directs)
  9. php 后台运行,php程序后台运行的实现方法
  10. 传感器学习——TB6612
  11. XILINX DMA/Bridge Subsystem for PCI Express (XDMA)笔记1(基于VU250 board)
  12. 系统学习机器学习之特征工程(一)--维度归约
  13. 关于CC的完全非线性椭圆方程一书的一些小结
  14. leetcode 思路——64. 最小路径和——174. 地下城游戏
  15. 剑指 Offer 42. 连续子数组的最大和(官解)
  16. 微软业务生产力平台基础架构优化(BPIO)之企业项目管理(EPM)解决方案
  17. 解决 Windows资源保护找到了损坏文件但无法修复问题
  18. Day 07-常用Composition API_watch监听器 和 watchEffect高级监听器
  19. 【40-系统性能压力测试基本概念-相关性能指标HPSTPSQPSRT-安装Jmeter教程-JMeter测试流程-线程组-取样器-监视器-测试商城首页-JMeter Address 占用的问题】
  20. python输出结果为false的是_print('Python'.isalpha()) 的输出结果是:False

热门文章

  1. 靠追热点出圈,网易传媒打造“爆款制造机2.0”
  2. ​ 众至科技数据防泄露系统,保护企业办公核心数据
  3. html 气泡上升效果,css气泡效果
  4. Android开发踩坑之旅
  5. R语言并行计算实战教程
  6. mysql数据表分析统计记录
  7. 电子产品高温贮存试验的价格-第三方检测机构
  8. OpenStack-Placement组件部署详解(T版)
  9. LDA + SVM 文本分类
  10. 网站结构之扁平结构与树形结构的区分