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. XMPP接受发送消息
  2. P3865 【模板】ST 表【又称RMQ】
  3. 作业调度问题java代码_Tabu Search求解作业车间调度问题(Job Shop Scheduling)-附Java代码...
  4. 2010年下半年计算机专业技术资格考试工作安排
  5. 学以致用三十四-----python2.0加载图片
  6. linux hdparm 测试磁盘io,Linux测试硬盘读写速度之hdparm命令
  7. android 办公桌面壁纸,android系统励志的壁纸欣赏
  8. rtk采点后如何导入cad_SMT贴片机是如何编程的
  9. 指针概念、指针大小和内存详解
  10. 医疗行业某集团公司财务系统迁移阿里云的案例分享
  11. 四年级计算机课的检讨,四年级下册信息技术教学反思.doc
  12. [转载]一篇经典的求职经历博客,值得深入研究和学习
  13. am解调matlab程序,基于Matlab的AM调制解调.doc
  14. VMware虚拟机使用虚拟机网络编辑器NAT模式配置网络图文教程,实现联网功能并测试
  15. 安全合规/GDPR--26--研究:GDPR疑难点及合规建议
  16. Scala学习笔记(三)
  17. 产品3周迭代一次,启信宝驾驭8000万企业征信的平台架构
  18. 显示器检测不到输入信号的原因及解决方法
  19. Unity中 利用Line Renderer || Trail Renderer制作飘烟拖尾
  20. 极光特效 html,FLASH教程:用Flash制作极光文字特效动画教程 - 学无忧

热门文章

  1. 自媒体这样运营想不成功都难!
  2. 贪心搜索(greedy search)、集束搜索(beam search)、随机采样(random sample)
  3. 汇编语言笔记(王爽)
  4. Android 项目开发填坑记 - 谷歌商店上架被拒 Apps On Device
  5. python二次方程_怎么用python解一元二次方程?
  6. 震惊了,王者荣耀项目组发了60个月的年终奖!!!妈妈,我要做游戏
  7. 白鹭引擎 4.0 发布 让重度H5游戏研发更简单
  8. 在sublime中插入图片
  9. 取球游戏(C++)[堆]
  10. 小米玩机------MIUI里那些你可能不知道的冷知识