Goaccess 分析网站日志
可以根据nginx日志一键生成报告。
安装
大部分 Linux 都可以一键安装。apt install goaccess
或者 yum install goaccess
确定日志格式
主要确定日志中的日期时间以及对应的字段。
根据Goaccess官方文档,它可以识别以下字段。%x
预先定义的时间戳格式,就是下面的日期、时间字段合并。需用--datetime-format=
选项来定义后才能在--log-format=
中使用。这个功能在1.6.1添加。如果提示不能使用这个参数,请检查goaccess版本是否大于等于1.6.1。%t
预先定义的时间格式,需用--date-format=
定义后才能在--log-format=
中使用。%d
预先定义的日期格式,需用--time-format=
定义后才能在--log-format=
中使用。%v
The server name according to the canonical name setting (Server Blocks or Virtual Host).%e
HTTP基本鉴权的用户名%C
缓存状态%h
客户端IP,v4或者v6%r
客户端请求字符串,包括请求方式、地址等信息的特定格式的字符串。我也不知道是个什么格式,所以就用 %m
%U
%q
%H
单独解析每个字段。
- 注意:
%r
就是用%m
%U
%q
%H
组合出来的,所以用一种方式就好。
%m
请求的方法: get, post, option。%U
请求的路径。
- 注意: 如果请求路径中带了参数,那就没必要用
%q
。
%q
请求的参数。%H
请求的协议,HTTP/1.1等。%s
服务器响应码:200,403,404,500等。%b
服务器响应大小,单位是bit。%R
引用页,用户进入该网址之前的网页。%u
用户代理,表明浏览器类型的一串字符。%K
TLS 加密设置。 (In Apache LogFormat: %{SSL_PROTOCOL}x).%k
TLS 加密设置。 (In Apache LogFormat: %{SSL_CIPHER}x).%M
服务器响应类型。 (In Apache LogFormat: %{Content-Type}o)%D
服务器响应时间,单位:微秒。%T
服务器响应时间,单位:秒,精确到毫秒。%L
服务器响应时间,单位:毫秒。%n
服务器响应时间,单位:纳秒。%^
忽略这个字段。%~
向后移动到一个非空字段。~h
从X-Forwarded-For中读取的客户端IP,v4或v6。
我之前在这篇文章中自定义了Nginx日志,增加了IP和归属地字段。下面就以我自定义的日志格式为例,说明如何配置Goaccss。
US 52.167.144.145 [03/Jan/2025:14:15:31 +0800] GET /article/1111 HTTP/1.1 404 2246 - Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/116.0.1938.76 Safari/537.36
这行日志可以拆分为以下几个部分:US
IP归属地,没有对应的字段,忽略。%^
52.167.144.145
客户端IP地址。%h
03/Jan/2025
请求日期。%d
14:15:31
请求时间。%t
+0800
服务器时区,忽略。%^
GET
请求方法。%m
/article/1111
请求路径。%U
HTTP/1.1
协议。%H
404
服务器状态码。%s
2246
服务器返回的大小。%b
-
引用页,这个请求的引用页为空,所以此处是一个短横线。%R
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko;compatible;bingbot/2.0;+http://www.bing.com/bingbot.htm) Chrome/116.0.1938.76 Safari/537.36
用户代理。%u
如果你的goacces版本大于等于1.6.1,就可以用时间戳。--datetime-format='%d/%b/%Y:%H:%M:%S %z'
(日/月/年:时:分:秒 时区)
goaccess /home/wwwlogs/web.log -o /home/wwwroot/report.html --log-format='%^ %h [%x] %m %U %H %s %b %R %u' --datetime-format='%d/%b/%Y:%H:%M:%S %z'
Goacces版本小于1.6.1要单独定义日期和时间。
goaccess /home/wwwlogs/web.log -o /home/wwwroot/report.html --log-format='%^ %h [%d:%t %^] %m %U %H %s %b %R %u' --date-format='%d/%b/%Y' --time-format='%H:%M:%S'
命令测试正常,就可以把格式写入配置文件/etc/goaccess/goaccess.conf
了。
date-format %d/%b/%Y
time-format %H:%M:%S
log-format %^ %h [%d:%t %^] %m %U %H %s %b %R %u
总结
总是,就是要一一对应,每个字段的值要让程序能够正确识别,出现Token '/article/201' doesn't match specifier '%s'
之类的错误,就看看对应的字段是否合适。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。