goaacess分析nginx,apache日志
安装
- centos下安装
yum -y install goaccess
- mac下安装
brew install goaccess
日志分析
实时分析nginx日志
LANG="zh_CN.UTF-8" goaccess -f ./wap_greencampus_access.log -o ./res.html --log-format=COMBINED --real-time-html --config-file=/usr/local/Cellar/goaccess/1.6/etc/goaccess/goaccess.conf
自定义的nginx内容格式–特殊,并使用中文
LANG="zh_CN.UTF-8" goaccess -f ./tmp.log -o ./nginx_res.html --log-format='%h - %^[%d:%t %^] %^ "%r" %s %b "%R" "%u"' --date-format='%d/%b/%Y' --time-format='%T'
系统自带的nginx默认格式,并且使用中文
LANG="zh_CN.UTF-8" goaccess -f ./access.log -o ./nginx_res.html --log-format=COMBINED --config-file=/etc/goaccess/goaccess.conf
解析apache日志
LANG="zh_CN.UTF-8" goaccess -f ./http_1336.log -o ./res1.html --log-format='%h - %^[%d:%t %^] "%m %U %H" %s %b' --date-format='%d/%b/%Y' --time-format='%T'
格式参数说明
- %t 匹配 time-format 变量的时间字段。
- %d 匹配 date-format 变量的日期字段。
- %v 根据 canonical 名称设定的服务器名称(服务区或者虚拟主机)。
- %h 主机(客户端IP地址,IPv4 或者 IPv6)。
- 客户端请求的行数。这些请求使用分隔符(单引号,双引号)引用的部分可以被解析。否则,需要使用由特殊格式说明符(例如:%m, %U, %q 和 %H)组合格式去解析独立的字段。
注意: 既可以使用 %r 获取完整的请求,也可以使用 %m, %U, %q and %H 去组合你的请求,但是不能同时使用。- %m 请求的方法。
- %U 请求的 URL。
注意: 如果查询字符串在 %U中,则无需使用 %q。但是,如果 URL 路径中没有包含任何查询字符串,则你可以使用 %q 查询字符串将附加在请求后面。- %q 查询字符串。
- %H 请求协议。
- %s 服务器回传客户端的状态码。
- %b 回传客户端的对象的大小。
- %R HTTP 请求的 “Referer” 值。
- %u HTTP 请求的 “UserAgent” 值。
- %^ 忽略此字段。
- %~ 继续解析日志字符串直到找到一个非空字符(!isspace)。
- ~h 在 X-Forwarded-For (XFF) 字段中的主机(客户端 IP 地址,IPv4 或者 IPv6)。
通过例子来说明
执行的命令
我分析的是一个有1个多G的nginx的access日志,并且我对应的goaccess的配置文件在/usr/local/etc/goaccess下,当然这个配置文件路径可以根据自己的环境来的。
LANG="zh_CN.UTF-8" goaccess -f ./m.goaccess.art_access_20220720.log -o ./nginx_res.html --log-format=COMBINED --config-file=/usr/local/etc/goaccess/goaccess.conf
如果要展示成中文,就要执行前,设置LANG="zh_CN.UTF-8"
查看html文件
如果是linux系统的,就用ftp工具下载到本地查看
展示效果:
查看某个时间点的请求情况:
如果想单独从access.log文件中查看某个时间点下的请求情况可以
cat m.goaccess.art_access_20220720.log | grep "20/Jul/2022:18:00" > ~/0720_1800.log
goaccess来源:
https://www.goaccess.cc/?mod=man
一些技巧:
- 统计访问前10的IP
awk '{print $1}' access.log |sort |uniq -c |sort -k1 -nr |head -n 10
- 统计日志中访问大于100次的IP
awk '{a[$1]++}END{for(i in a){if(a[i]>100)print i,a[i]}}' access.log