什么是 GoAccess

GoAccess 是一个开源的、在命令行终端下运行的实时 Web 日志分析工具。

该工具提供快速多样的 HTTP 状态统计信息。

分析结果可以通过XShell等客户端工具查看,生成Html报告。

GitHub地址:https://github.com/allinurl/goaccess

官网地址:http://goaccess.io/

安装GoAccess

测试环境,centos7

# yum -y install glib2 glib2-devel ncurses ncurses-devel GeoIP GeoIP-devel

wget http://tar.goaccess.io/goaccess-1.2.tar.gz

tar -xzvf goaccess-1.2.tar.gz

cd goaccess-1.2/

./configure --enable-geoip --enable-utf8

制作 && 制作安装

默认配置文件在

vi /usr/local/etc/goaccess.conf

时间格式 %H:%M:%S

日期格式 %d/%b/%Y

日志格式

接下来,让我们测试一下。现在需要根据nginx的日志格式编写goaccess的规则

goaccess -f /usr/local/nginx/logs/access.log -a > /root/test/report.html

网络上的文章和介绍大多只适用于nginx的日志格式,没有做任何修改,对自定义日志格式的涉及不多。如果使用自定义的 nginx 日志格式,这里需要特别注意。一旦日志格式配置不正确,goaccess分析的结果就会很差。

以我的 nginx 日志格式为例:

log_format main '$server_name $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user _agent" "$http_x_forwarded_for" $upstream_addr $request_time $upstream_response_time;

根据goaccess预设的日志格式,这样的日志是无法分析的,所以我们需要自定义日志格式。

我的日志格式是:

日志格式 %^ %h %^ %^ [%d:%t %^] "%r" %s %b "%R" "%u" "%^" %^ %T %^

$server_name ---> %h ---> 主机(客户端 IP 地址、IPv4 和 IPv6)

[$time_local] ---> [%d:%t %^] ---> 时间

$request ---> "%r" ---> 客户端请求,这需要在请求中使用特定的分隔符(单引号、双引号或其他)进行分析。没有,我们必须使用特殊的组合说明符%m %U %H。

$status ---> %s ---> 发送客户端的状态码

$body_bytes_sent ---> %b ---> 将大小返回给客户端

$http_referer ---> %R ---> "Referrer"HTTP 请求头

$http_user_agent ---> "%u" ---> UA

$http\x\转发\for --->

$request_time ---> %T ---> 服务请求时间,以秒或毫秒为单位。注意:%D 将优先于%T 如果两者都使用。

为了设置正确的日志格式,踩了很多坑,先列出来,避免重复遇到。

(1) 默认情况下,日志格式以空格分隔日志信息。因此,包含空格等特殊字符的字段必须包含在“”中。如字段请求http_user_agent等

(2)nginx日志格式用空格隔开,但这里必须注意,只能用一个空格。当时我在一个地方用了两个空格,直接导致goaccess结果出错。

(3) nginx 日志中的每个字段都必须对应日志格式中的一个。如果日志格式不需要nginx中的某些信息,使用%^跳过该信息。

(4) nginx日志中的每个-log格式,需要一个%^跳过。如果是“-”,使用“%^”

(5)如果有:,在nginx日志信息中,也应该以日志格式显示。比如nginx日志中的$time_本地包含:,所以在日志格式对应的位置也是[%d:%t%^]

希望这些对使用goaccess的朋友有所帮助。

goaccess -f 日志[-c][-r][-m][-h][-q][-d][-g][- a][-o csv|json][-e IP_ADDRESS][...]

nginx的accesslog中用户定义的参数及其对应的fromat

%x 匹配替换时间_格式和日期_两者的全局设置(时间戳)可以同时调用

%t 匹配覆盖时间格式的设置

%d 匹配覆盖日期格式的设置

%h 客户端 ip $remote_addr

%r 请求方法 r e q u e s t Request%m 请求算法相当于requestrequest中post或get的Match

%U请求的URL路径(包括任何查询字符串)相当于U R L Horse match的r e q u e s t 请求中的URL匹配%H请求的协议,相当于请求中的URL匹配HTTP/1.1在请求中

%s服务器返回客户端的状态码$status

%b 返回客户端的正文大小 $body_bytes_sent

%R 参考 $http_referer

%u 用户代理 $http_user_agent

%D 服务请求时间,以微秒为单位 $request_time

%T 服务请求时间,以秒为单位 $request_time

%L 服务请求时间,以毫秒为单位 $request_time

%^忽略没有对应参数的区域

以上是官方给出的所有匹配参数。有关原始版本,请参阅

http://www.goaccess.io/man

以下是我自定义的 nginx 日志格式:

log_format main_zdy '$request_time - IP:$remote_addr - 真实 IP:$http_x_ forwarded_for - [$time_local] $request - $status - $http_user_agent - $host - 来自:$http_referer';

日志:

0.000 - IP:3.3.3.3 - RealIP:1.1.1.1, 2.2.2.2 - [28/Jul/2017:16:04:15 +0800] POST /site/index.html HTTP/1.1 - 200 - Apache -HttpClient/不可用 (java 1.4) - www.111111111.com - 来自:http://www.111111111.com

0.216 - IP:4.4.4.4 - RealIP:5.5.5.5, 6.6.6.6 - [28/Jul/2017:15:53:04 +0800] GET /client/serverlist?jsonpCallbacku003djQuery18206177038959697163_1501228347875&gidu003d163&widu003d 196&_u003d1501228353156 HTTP/1.1 - 200 - Mozilla/4.0(兼容;MSIE 7.0;Windows NT 5.1;Trident/4.0;.NET CLR 2.0.50727) - www.111111111.com - 来自:http://www。 1111111111111.com/

goaccess 格式:

日志格式 %T %^ IP:%^ %^ RealIP:~h{," } %^ [%d:%t %^] %m %U %H %^ %s %^ %u % ^ %^ %^ 来自:%R

%x 与时间格式匹配的日期和时间字段和日期格式变量。这是给时间戳记一个日期和时间的时候,而不是两个独立变量。

%t 时间字段匹配时间格式的变量。

%d 日期字段匹配日期格式的变量。

%v 服务器名称根据规范名称设置块(服务器或虚拟主机)。

%e 用户标识的人请求通过 HTTP 对文档进行身份验证。

%H 主机(客户端 IP 地址、IPv4 和 IPv6)

来自客户端的 %R 请求。这需要在请求特定的分隔符(单引号、双引号等)中解决。否则,将使用特殊格式说明符(例如 %m%U%Q 和 %H)的组合来解析单个字段。注意:使用 %r 获取完整的请求或使用 %m%U%Q 和 %h 来形成您的请求,而不是同时。请求方法让

%m 请求的方法。

%U 请求 URL 路径。注意:如果查询字符串在%u中,则不需要使用%q。但是,如果 URL 路径不包含任何查询字符串,您可以使用 %q 并且查询字符串将附加到请求中。

%q 查询字符串。

%H 请求协议。

%服务器发送给客户端的状态码。

%b 服务器发送给客户端的大小。

%R 来源

%u 用户代理 HTTP 请求标头。

%D 服务请求时间,以微秒为单位 $request_time

%T 服务请求时间,以秒为单位 $request_time

%L 服务请求的时间,以毫秒为单位,十进制数。

%^忽略这个区域。

%~向前遍历日志字符串,直到找到用于技术转换的 (!isspace) 字符。

~h 主机(客户端 IP 地址、IPv4 和 IPv6)位于 x-forward-for (XFF) 域中。

对于 XFF,GoAccess 使用一个特殊的说明符,该说明符由主机说明符之前的波浪号组成,后跟分隔 XFF 字段的字符,这些字符用大括号括起来(即 ~h{,"})。

例如,~h{," } 用于解析由双引号、逗号和空格分隔的“11.25.11.53, 17.68.33.17”字段。

XFF,GoAccess 使用特殊说明符将波浪号主机之前的字符分隔到 XFF 字段中,该字段由花括号括起来(即 ~ h {})。

例如,h~{} 用于解析“11.25.11.53,17.68.33.17”字段,以双引号、逗号和空格分隔。

goaccess -f /www/logs/nginx.log -a > /data/wwwroot/web/test/report1.html

-f 指定 nginx 日志文件

-p 指定日志格式文件

-o 输出到指定的html文件

--real-time-html 实时刷新

--ws-url 绑定一个域名

生成 HTML 演示文稿

生成的文件显示在带有 Web 服务器的浏览器上

goaccess -f /root/www.7477.com-access1000.log -a > /data/wwwroot/web/zabbix/1111/reporta1.html

goaccess -f /root/test.log -a > /data/wwwroot/web/zabbix/1111/reporta6.html

goaccess -f /root/www.7477.com-access181.log -a > /data/wwwroot/web/zabbix/1111/report.html

goaccess -f /root/www.7477.com-access1000.log -a > /data/wwwroot/web/zabbix/1111/report1.html

goaccess -f /root/www.funet8.com-access.log -a > /data/wwwroot/web/zabbix/1111/funet1.html

goaccess -f /root/1000.log -a > /data/wwwroot/web/test/report1.html

Logo

更多推荐