可以根据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' 之类的错误,就看看对应的字段是否合适。

文章目录