监控笔记菜鸟运维

超好用的Nginx日志分析工具GoAccess使用详解

如果把运维看做是医生给病人看病,则日志就是病人对自己的陈述,很多时候医生需要通过对病人的描述中得出病人状况,是否严重,需要什么计量的药,什么类型的药。所以古人有句话叫对症下药,这个症就是病人的描述加医生的判断,在重一点的病在加上很多的化验。在医生看病时病人的描述和化验单上的数据对医生是非常重要的。同理日志在运维中的作用也是类似的,但非常不幸,日志在很多运维中被严重低估,直到磁盘空间不足的时候才想到,这有个大的日志文件把他删了,这样可以节省空间。

国产免费主机面板使用体验:宝塔bt面板-界面清爽傻瓜式操作功能全面GoAccess

GoAccess是一个基于终端的快速日志分析器。其核心思想是实时快速分析和查看Web服务器统计信息,而无需使用您的浏览器(如果您希望通过SSH快速分析访问日志,或者只是喜欢在终端中工作),终端输出是默认输出,但它能够生成完整的,独立的实时 HTML报告(非常适合分析,监控和数据可视化),以及a JSON和CSV报告。

  • 所有面板和指标都定时在终端输出上每200毫秒更新一次,在HTML输出上每秒更新一次。
  • GoAccess允许任何自定义日志格式字符串。预定义选项包括Apache,Nginx,Amazon S3,Elastic Load Balancing,CloudFront等
  • 跟踪提供请求所需的时间。如果您想跟踪减慢网站速度的网页,则非常有用。
  • 数据持久性强,GoAccess能够通过磁盘上的B + Tree数据库逐步处理日志。
  • GoAccess是用C语言编写的,要运行它,你只需要将ncurses作为依赖项,它甚至还具有自己的RFC6455兼容Web Socket服务器。
  • 您可以针对访问日志文件运行它,选择日志格式并让GoAccess解析访问日志并显示统计信息。
  • 按小时或日期确定最慢运行请求的匹配数,访问者数,带宽数和指标数。
  • 多个虚拟主机,一个面板,显示哪个虚拟主机正在消耗大部分Web服务器资源。
  • 定制GoAccess以适合您自己的色彩品味。通过终端,或者只是更新HTML输出上的样式表。

部署方案

方案一:Yum安装部署

yum install glib2 glib2-devel GeoIP-devel  ncurses-devel zlib zlib-develyum install gcc -y
yum -y install GeoIP-update
yum install goaccess

#修改/etc/nginx/nginx.conf文件的日志存储格式
log_format  main  ‘$remote_addr – $remote_user [$time_local] requesthost:”$http_host”; “$request” requesttime:”$request_time”; ‘
‘$status $body_bytes_sent “$http_referer” – $request_body’
‘”$http_user_agent” “$http_x_forwarded_for”‘;

#修改文件/etc/goaccess.conf改成goaccess格式标准对应为
time-format %T
date-format %d/%b/%Y
log-format %h – %^ [%d:%t %^] requesthost:”%v”; “%r” requesttime:”%T”; %s %b “%R” – %^”%u”

#测试生成页面
goaccess -f /var/log/nginx/access.log -c -a>/usr/share/nginx/html/go.html

方案二:源码安装部署

#yum安装依赖包
yum install glib2 glib2-devel GeoIP-devel  ncurses-devel zlib zlib-devel
yum install gcc -y
rpm -Uvh https://dl.Fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
yum -y install GeoIP-update

#下载goaccess源码包,并解压编译安装
wget https://tar.goaccess.io/goaccess-1.3.tar.gz
tar xzvf goaccess-1.3.tar.gz
cd goaccess-1.3/./configure –enable-geoip –enable-utf8make && make inst

PS:这里还有一篇相关文章可以参考服务器日志分析利器ngxtop和GoAccess实战

用Access来分析Nginx日志

安装完成后就可以开始使用GoAccess了。

首先,进入nginx的日志目录,如/var/log/nginx,输入如下命令让goaccess打开指定文件:

命令:
goaccess -f access.log

打开之后会跳出选择日志文件类型的界面:

nginx_log_analysis_tool_goaccess_details1.jpg插图(1)

Nginx日志是属于NCSA Combined Log Format (XLF/ELF)类型的,所以我们选择第一个。用上下光标移动,空格选中,回车确定。(PS:若确实不确定是什么格式的,可以尝试反复选择,按q键返回,按Enter键确认)

进入了主界面:

nginx_log_analysis_tool_goaccess_details2.jpg插图(2)

详细键盘操作:

  • F1h:帮助
  • F5 :刷新主界面
  • q:退出程序/当前窗口/折叠当前模块
  • oEnter:展开选中的模块或窗口
  • 0-9以及Shift + 0:将选中的模块或窗口激活
  • kj:模块内部移动
  • c:修改配色
  • ^f^b:模块中上下滚屏
  • tab shift+tab:前后切换模块
  • s:模块内部排序选择
  • /:在所有模块中搜索(支持正则)
  • n:找到下个匹配
  • gG:跳到第一项/最后一项

以上测试部分结束了,接下来开始正式配置主配置文件:

#修改文件/usr/local/etc/goaccess.conf改成goaccess格式标准对应为(请参照conf文件中的提示关键词 apache 或者是 nginx)
time-format %T
date-format %d/%b/%Y
log-format %h – %^ [%d:%t %^] requesthost:”%v”; “%r” requesttime:”%T”; %s %b “%R” – %^”%u”

#测试生成页面
/usr/local/bin/goaccess -p /usr/local/goaccess/etc/goaccess/goaccess.conf -f /var/log/nginx/access.log -c -a -o /usr/share/nginx/html/www.html

#后台实时生成数据到goaccess页面
/usr/local/bin/goaccess -p /usr/local/goaccess/etc/goaccess/goaccess.conf -f /var/log/nginx/access.log -o /usr/share/nginx/html/www.html  –real-time-html &

访问test.andyx.net/test/www.html之后我们就会看到如下页面:

nginx_log_analysis_tool_goaccess_details3.jpg插图(3)
页面中的关键字详解:

General Statistics:此面板提供了几个指标的摘要,其中一些包括:有效和无效请求的数量,分析数据集所花费的时间,唯一访问者,请求的文件,静态文件(CSS,ICO,JPG等)HTTP引用,404s,已解析日志文件的大小和带宽消耗。

Unique visitors:此面板显示点击次数,唯一身份访问者和每个日期的累积带宽等指标。包含相同IP,相同日期和相同用户代理的HTTP请求被视为唯一访问者。默认情况下,它包括网络爬虫/蜘蛛。 可以使用–date-spec = hr将日期特异性设置为小时级别,这将显示日期,例如05 / Jun / 2016:16。如果您想跟踪小时级别的每日流量,这非常棒。

Requested files:此面板显示Web服务器上请求最多的文件。它显示了匹配,唯一身份访问者和百分比,以及累积带宽,协议和使用的请求方法。

Requested static files:列出了最常用静态文件,如:JPG,CSS,SWF,JS,GIF,和PNG文件类型,使用相同的指标作为最后的面板一起。可以将其他静态文件添加到配置文件中。

404 or Not Found:显示与先前请求面板相同的指标,但是,其数据包含在服务器上找不到的所有页面,或通常称为404状态代码。

Hosts:此面板包含有关主机本身的详细信息。这非常适合发现×××性爬虫,并确定谁在吃你的带宽。 扩展面板可以显示更多信息,例如主机的反向DNS查找结果,原产国和城市。如果-a启用了参数,则可以通过选择所需的IP地址,然后按Enter来显示用户代理列表。

Operating Systems:此面板将报告主机在到达服务器时使用的操作系统。它试图提供每个操作系统的最具体版本。
Browsers:此面板将报告主机在访问服务器时使用的浏览器。它试图提供每个浏览器的最具体版本。
Visit Times:此面板将显示每小时报告。此选项显示24个数据点,每天一小时一个。 可选地,可以使用–hour-spec = min将小时特异性设置为十分之一水平,这将显示小时为16:4如果您想要发现服务器上的流量峰值,这很好。
Virtual Hosts:此面板将显示从访问日志中解析的所有不同虚拟主机。如果在日志格式字符串中使用%v,则会显示此面板。
Referrers URLs:如果相关主机通过其他资源访问了网站,或者是从其他主机链接/转移给您,则会在此面板中提供引用它们的网址。请参阅`–ignore-panel`配置文件以启用它。 (默认禁用)
Referring Sites:此面板仅显示主机部分,但不显示整个URL。请求来自的URL。
Keyphrases:它报告了用于Google搜索,Google缓存和Google翻译的关键字,这些关键字已导致您的网络服务器。目前,它仅通过HTTP支持Google搜索查询。请参阅`–ignore-panel`配置文件以启用它。 (默认禁用)
Geo Location:确定IP地址在地理位置的位置。统计数据按大陆和国家分列。它需要使用GeoLocation支持进行编译。
HTTP Status Codes:HTTP请求的数字状态代码的值。
Remote User (HTTP authentication):这是HTTP身份验证确定的请求文档的人员的用户ID。如果文档没有密码保护,则此部分将为“ – ”,就像前一个部分一样。除非%e在log-format变量中给出,否则不会启用此面板。

命令行下相关:

在使用goaccess命令行前,我们必须配置日志文件的解析格式,因为此处没有界面来让你选择日志格式了。

看一下日志格式:

1
2
$tail access.log
117.217.138.224 - - [22/Jul/2019:19:25:44 +0800] "GET / HTTP/1.1" 301 185 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36" "-"

如果你的日志格式和我一样,那么就不用自己折腾了。请跳过下一小段。

如果你的日志格式和我不同,那么请去http://goaccess.io/man#custom-log 看一下格式的基本规范。以我的log为例:

ip - - [日期] "请求类型" 服务器响应 大小 来源 浏览器信息 "代理"

%h %^[%d:%^] "%r" %s %b "%R" "%u" %^

各项代表的意思可以去http://goaccess.io/man#custom-log 查看。

现在配置一下:

命令:
vim /etc/goaccess.conf

如果有这行:

1
2
#NCSA Combined Log Format with Virtual Host
#log-format %^:%^ %h %^[%d:%^] "%r" %s %b "%R" "%u"

那就去掉下面log-format前的#吧。

如果没有,就写一行。

log-format %h %^[%d:%^] "%r" %s %b "%R" "%u" %^

找到

1
2
#Any Apache log date format
#date-format %d/%b/%Y

取消掉date-format的注释。


使用GoAccess生成html报告:

命令:
# goaccess -f access.log -a > report.html

生成json报告:

命令:
goaccess -f access.log -a -d -o json > report.json

CSV:

命令:
goaccess -f access.log -o csv > report.csv

由于nginx会自动压缩日志,一下命令可以直接分析压缩后的日志:

1
2
3
zcat access.log.*.gz | goaccess
#或者
zcat -f access.log* | goaccess

支持各种管道:

命令:
sed -n '/11\/Dec\/2014/,$ p' access.log | goaccess -a

想分析下百度/google对你网站爬了些啥内容?Easy:

命令:
grep -E "(google|baidu)"access.log | goaccess -a

 


GoAccess有哪些不足?

  1. 只支持maxmind的地理数据库。当然maxmind也有免费版本
  2. 其他的缺点实在想不到了。因为支持管道,所以一切都那么方便.

最后

GoAccess日志分析工具的功能还有很多,可以细分到统计某一天、某一个IP用户的访问情况,也可以统计某个时间段的,更可以导出CSV表格整理汇总分析;

 

文章参考自“Linux公社”:https://www.linuxidc.com/Linux/2018-09/153877.htm