GoAccess初探.docx
《GoAccess初探.docx》由会员分享,可在线阅读,更多相关《GoAccess初探.docx(17页珍藏版)》请在冰豆网上搜索。
GoAccess初探
real-timewebloganalyzer
一关于GoAccess3
1GoAccess是什么?
3
2特点3
3为什么用GoAccess3
4缺点4
geoip粒度太粗4
日期粒度太粗4
二GoAccess的安装4
1最新安装包的下载4
2需要安装的依赖4
2.1官方给出的相关依赖提示5
2编译安装5
2.1编译的参数5
3yum安装(我们选择这种方式)6
三GoAccess参数说明6
四GoAccess的使用8
五GoAccess对于access日志的自定义9
1如何自定义日志格式9
2官方自定义日志格式的参数9
2.1自定义参数及其对应nginx的accesslog中的fromat10
3根据我们的nginx的format自定义日志格式10
六真正分析access日志11
键盘操作:
12
七使用GoAccess生成报表及一些管道的应用12
八两个问题的调研13
1关于设备识别unknow的问题13
2没有找到对错误日志的分析方法16
一关于GoAccess
1GoAccess是什么?
GoAccess是一款开源工具,它可以实时地去分析web的log并且提供了在*nix系统上通过交互式窗口来运行查看,它通过可视化报表快速提供给系统管理员有价值的关于HTTP的统计信息。
2特点
可以将指定的weblog文件进行解析,通过终端把统计的数据展现出来
●生成统计数据,带宽统计等
●请求的时间(有利于查看慢的站点)
●最高访问
●请求的静态文件统计,例如图片,js,css等
●各个状态码的统计
●Host,反向DNS,ip所在地
●操作系统
●浏览器/蜘蛛
●引用的网站
●引用的URLs
●关键词组
●地理位置(大陆、国家、城市)
●可输出JSON或CSV
●各种的颜色主题
●支持大容量数据且支持大容量数据的持续分析
●支持IPv6
●可生成HTML报告
3为什么用GoAccess
GoAccess背后的主要思想是能够快速分析和查看web服务器统计数据,虽然可以生成一个HTML、JSON、CSV报告,默认情况下它输出终端,并且你还可以用到他更多的监控命令工具。
4缺点
geoip粒度太粗
它是使用机器自带的GeoIP,这个自带的77k左右的IP库只能判断出国籍,不能判断到城市。
呃,这个就意味着你的报表中有99%的IP统计是来自:
China。
你可以升级你的GeoIp,但是,付费。
网上有免费的GeoLiteCity.dat库,但是goaccess自身就不支持国籍-城市的分类,也不支持使用外部的IP库。
我能想到还有的办法就是用goaccess生成json,然后自己写python也好,php也好程序来加载城市的Ip库来解析地理位置。
然后再生成报表。
不过,这样,好像就不美了。
好消息是这个功能在ISSUE中有人提了,TODOLIST。
日期粒度太粗
日期只能粒度到天,如果需要统计一天每个小时的访问数据,就没法了。
也不是没办法,你可以先grep小时的数据,然后再用goaccess解析。
不过,这样,好像很挫。
好消息是这个功能在ISSUE中有人提了,TODOLIST。
二GoAccess的安装
1最新安装包的下载
通过http:
//goaccess.io/download可以下载到最新的tar包
2需要安装的依赖
yuminstallglib2glib2-develGeoIP-develncurses-devel
根据官方给出的提示,这里我们先安装好相应的依赖,以便日后的使用
2.1官方给出的相关依赖提示
Distro
NCurses
GLib>=2.0.0
GeoIP(optional)
TokyoCabinet(optional)
Ubuntu/Debian
libncursesw5-dev
libglib2.0-dev
libgeoip-dev
libtokyocabinet-dev
Fedora/RHEL/CentOS
ncurses-devel
glib2-devel
geoip-devel
tokyocabinet-devel
ArchLinux
ncurses
glib2
geoip
compilefromsource
Gentoo
sys-libs/ncurses
dev-libs/glib:
2
dev-libs/geoip
dev-db/tokyocabinet
2编译安装
1wgethttp:
//tar.goaccess.io/goaccess-0.9.2.tar.gz2tar-xzvfgoaccess-0.9.2.tar.gz3cdgoaccess-0.9.2/4./configure--enable-geoip--enable-utf85make6makeinstall
2.1编译的参数
--enable-debug
用于调试并且关闭编译器优化
--enable-utf8
用于支持更多的字符集,满足Ncursesw的需求
--enable-geoip
用于地理位置的支持.满足MaxMind'sGeoIP需求
--enable-tcb=
用于对memhash和btree的支持
--disable-zlib
在btee数据库上禁用zlib压缩
--disable-bzip
在btree数据库上禁用bzip压缩
3yum安装(我们选择这种方式)
先安装epel
Wgethttp:
//dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpmwgetrpm-Uvhremi-release-6*.rpmepel-release-6*.rpm
安装GoAccess
yuminstallgoaccess-y
安装十分方便,到此就结束了
三GoAccess参数说明
goaccess-flog[-c][-r][-m][-h][-q][-d][-g][-a][-ocsv|json][-eIP_ADDRESS][...]
-a--agent-list
可以在host栏点击ip显示useragent如下图
-c--config-dialog
是否显示log和format配置对话窗口,也可以用于日后标准格式的调试,和重新设定格式
-d--with-output-resolver
生成json报表需要用到的参数
-e--exclude-ip
排除某个IP或者一个范围例如., 192.168.0.1-192.168.0.10
-f--log-file
用于解析日志文件,必加的参数
-g--std-geoip
支持标准的geoip
-h--help
帮助
-H--http-protocol
包含HTTP请求的协议,格式中已设定无需加此参数
-m--with-mouse
支持鼠标的点击,点击相当于键盘的回车操作
-M--http-method
包含请求的方法和当前的请求,以后的格式中已设定,无需此参数
-o--output-format
生成jsion和csv报表需要加此参数导出
-p--config-file
可以指定已经配置好格式的配置文件,优先于默认的格式
-q--no-query-string
忽略请求中疑问号后的query例如
=>
官方提示移除这个可以减少内存的消耗,根据需求而定
-r--no-term-resolver
禁止ip在终端上的显示
-s--storage
显示当前的存储算法
-h--help
命令行的帮助
-V--version
显示版本号
--444-as-404
视444code为404code
--ignore-panel=PANEL
忽略以下列出的数据
VISITORS
REQUESTS
REQUESTS_STATIC
NOT_FOUND
HOSTS
OS
BROWSERS
VISIT_TIMES
REFERRERS
REFERRING_SITES
KEYPHRASES
GEO_LOCATION
STATUS_CODES
--real-os
展示真实的操作系统。
在OperationSystem模块中,是否展示更详细的操作系统信息。
四GoAccess的使用
首次我们通过执行goaccess-faccess.log解析得到以下窗口
CommonLogFormat(CLF)此适用于apache标准日志
通用日志格式,例子:
127.0.0.1-frank[10/Oct/2000:
13:
55:
36-0700]"GET/apache_pb.gifHTTP/1.0"2002326主机用户身份作者[日期]"请求方法请求路径请求协议"状态码字节数
NCSACommbinedLogFormat适用于nginx标准日志
这个是CommonLogFormat的扩展,例子:
125.125.125.125-dsmith[10/Oct/1999:
21:
15:
05+0500]"GET/index.htmlHTTP/1.0"2001043""Mozilla/4.05[en](WinNT;I)""USERID=CustomerA;IMPID=01234"主机用户身份作者[日期]"请求方法请求路径请求协议"状态码字节数referrer客户端代理cookie
需要注意的是
当空格选中模式的时候按回车会出现此报错,是由于你配置文档没有打开日志格式和日期格式的注释,或者说是有可能日志格式与系统给出的相应格式不符,系统无法读取
显然这里我们不能通过官方给出的标准格式来解析
五GoAccess对于access日志的自定义
1如何自定义日志格式
1.1可以通过-c的参数来调出上面系统自带的定义日志格式窗口,因为在你设置完日志格式后执行goaccess-faccess.log就不会再调出此窗口,只有首次执行才会调用,所以要通过-c参数
1.2我们可以通过修改/etc/, /usr/etc/ or /usr/local/etc/下的配置文件来进行自定义格式
Vim/etc/goaccess
按照上图,取消data-format和log-format的注释,定义自己的格式,或者自己加两行也可以
2官方自定义日志格式的参数
time_format在配置文件可以加入字段,后面加上时间的自定义参数,对时间格式做全局设置
date_format在配置文件可以加入此字段,后面加上日期的自定义参数,对日期格式做全局设置
log_format 在配置文件可以加入此字段,后面加上自定义的日志参数,对日志格式进行全局的设置
2.1自定义参数及其对应nginx的accesslog中的fromat
%x匹配替代time_format和date_format的设定,可以同时调用两个的全局设置
%t匹配替代time_fromat的设置
%d匹配替代date_format的设置
%h客户端ip$remote_addr
%r请求方法$request
%m请求算法相当于$request中的post或get的匹配
%U请求的URL路径(包括任何查询字符串)相当于$request中的URL匹配
%H请求的协议相当于$request中的HTTP/1.1
%s服务端返回客户端的状态code$status
%b返回客户端的bodysize$body_bytes_sent
%Rrefer$http_referer
%uuser-agent$http_user_agent
%D服务请求的时间,以微秒为单位$request_time
%T服务请求的时间,以秒为单位$request_time
%L服务请求的时间,以毫秒为单位$request_time
%^忽略官方没有对应参数的区域
以上是官方给出的所有匹配参数,原版见http:
//www.goaccess.io/man
3根据我们的nginx的format自定义日志格式
log_formatmain'$hostname$server_name$remote_addr-$remote_user[$time_local]"$request"'$status$body_bytes_sent"$http_referer"'
'"$http_user_agent""$http_x_forwarded_for""$upstream_addr"'
'"$upstream_response_time""$request_time""$http_cookie"';
例如:
以上为nginx中的format配置
根据nginx中的format信息和真实访问日志内容,得出以下自定义格式
date-format%d/%b/%Y
log-format%^%^%h%^[%d:
%^]"%r"%s%b"%R""%u""%^""%^:
%^""%^""%T""%^"
注意以上log-format每个参数之间有空格,跟真实访问日志中空格对应
下面对log-fomat后面匹配参数从左至右依次于nginx的format和真实日志内容进行对应
Log-fromat相应参数
Nginx相应format
%^
'$hostname
%^
$server_name
%h
$remote_addr
%^
-$remote_user
[%d:
%^]
[$time_local]
“%r”
"$request"
%s
$status
%b
$body_bytes_sent
“%R”
$http_referer
"%u"
$http_user_agent
"%^"
$http_x_forwarded_for
"%^:
%^"
$upstream_addr
"%^"
$upstream_response_time
"%T"
$request_time
"%^"
$http_cookie
date-format%d/%b/%Y对应的是14/Jul/2015
%^[%d:
%^]对应的是--[14/Jul/2015:
18:
13:
06+0800]这部分是官方默认配置方法
这里的%d调用的就是date-format格式
并且这里的匹配是官方默认方法,不用特意留意--:
+这些符号和空格
通过-c参数调出的官方日志设置窗口可以分析出这点
到此日志格式就定义完成了
六真正分析access日志
此时通过goaccess-flog日志名字直接可以分析,因为在配置文档设置过,不会再弹出之前官方的日志设置窗口,如果想弹出可以加-c参数
键盘操作:
⏹F1或h:
帮助
⏹F5 :
刷新主界面
⏹q:
退出程序/当前窗口/折叠当前模块
⏹o或Enter:
展开选中的模块或窗口
⏹0-9以及Shift+0:
将选中的模块或窗口激活
⏹k和j:
模块内部移动
⏹c:
修改配色
⏹^f和^b:
模块中上下滚屏
⏹tab shift+tab:
前后切换模块
⏹s:
模块内部排序选择
⏹/:
在所有模块中搜索(支持正则)
⏹n:
找到下个匹配
⏹g和G:
跳到第一项/最后一项
七使用GoAccess生成报表及一些管道的应用
使用GoAccess生成html报告:
goaccess-faccess.log-a>report.html
生成json报告:
goaccess-faccess.log-a-d-ojson>report.json
CSV:
goaccess-faccess.log-ocsv>report.csv
由于nginx会自动压缩日志,以下命令可以直接分析压缩后的日志:
1
2
3
zcataccess.log.*.gz|goaccess
#或者
zcat-faccess.log*|goaccess
一些其他关于管道的用法
zcataccess.log.1.gz|goaccess
让goaccess去分析已经打包压缩好的日志文件。
或者干脆分析目前下所有日志
zcataccess.log*|goaccess
如果需要分析某天的日志,例如10月5号那天的日志,我们让linux管道命令来大显身手
sed-n‘/05/Dec/2010/,$p’access.log|goaccess-s-b
分析从11月5号到12月5号一个月内的日志
sed-n‘/5/Nov/2010/,/5/Dec/2010/p’access.log|goaccess-s-b
当你不希望在服务器上安装goaccess程序,可以通过调用本地的goaccess程序来分析服务器上的日志
sshuser@server‘cat/var/log/apache2/access.log’|goaccess-s-a-b
可以排除某个IP或者一个列表的IP交给goaccess
grep-v"`catexclude_vhost_list_file`"vhost_access.log|goaccess
八两个问题的调研
1关于设备识别unknow的问题
此项应该是从user_agent判断,但是不清楚为什么识别不了ios
分别取出ios的总数和android总数
(ios)68494+(android)17292=85786
用68494/85786=79%
与报表中计算基本相似,没导致完全准确可能是由于下面截图导致
我对这列进行过滤发现会出现一些(linux;字段
专门对一条包含IOS的accesslog进行分析
日志内容如下:
XXXXXXXXXXXX.comXXXXXXXXXXXXX117.136.60.57--[14/Jul/2015:
18:
00:
01+0800]"GET/urlHTTP/1.1"2001483"-""ios""-""XX.XX.XX.XX""0.017""0.017""XXXXXXXXXXXXXXXXXXXXXXXXX"
结果仍然是
说明跟上面提到的Linux字段没有关系,goaccess无法识别
然后再单独查看安卓字段的日志
日志内容如下:
XXXXXXXXXXXX.comXXXXXXXXXXXXX117.136.60.57--[14/Jul/2015:
18:
00:
01+0800]"GET/urlHTTP/1.1"2001483"-""ios""-""XX.XX.XX.XX""0.017""0.017""XXXXXXXXXXXXXXXXXXXXXXXXX"
结果
可以分析出安卓
Goaccess基本没什么详细文档,官方也没明确说法
这是我在issue查到一个相关的问题,如下图
2没有找到对错误日志的分析方法
我首先用分析访问日志方法去匹配超时的那种errorlog
%d%t[%^]%^#%^:
*%^%^,%^:
%h,%^:
$^,%^:
"%r",%^:
"%R",%^:
"%^"
这样是不成功的,然后我分析访问日志没逗号,我把逗号全部去掉也不行
然后我再以空格为分隔,所有未知区域用%^代替,还是不成功的,
然后我逐次去掉不同的符号去匹配也是不成功,然后就有了下面的想法
如果用errorlog去拼凑accesslog
首先accesslog的解析是没问题的
log-format%^%^%h%^[%d:
%^]"%r"%s%b"%R""%u""%^""%^:
%^""%^""%T""%^"
我把后面都删除只剩下log-format%^%^%h%^[%d:
%^]
想试试goaccess有没有那么智能,只要匹配上正确的就能解析,显然不行
然后我又用这种方式log-format%^%^%h%^[%d:
%^]%^
在后面加上了一个%^看看能不能全部匹配上后面的内容,显然还是不行
然后我又尝试
log-format%^%^%h%^[%d:
%^]"%^"%^%^"%^""%^""%^""%^:
%^""%^""%^""%^"
后面全部用%^忽略每个区域,数量都是对上的,但是显然还是不行
由此判断它对日志的分析有自己的一套格式,对于匹配要求很高
最后我把errorlog的所有未知区域都去掉,最小化分析
2015/07/1719:
10:
2061.158.152.98
"POST/Utility/PVCounter.apiHTTP/1.1""http:
//10.10.30.65:
80/Utility/PVCounter.api"
log-format%d%H:
%M:
%S%h"%r""%^"
还是没有成功