GoAccess 日志分析工具

By | 2024年4月7日

介绍

GoAccess 是一款开源的且具有交互视图界面的实时 Web 日志分析工具,能为系统管理员提供快速且有价值的 HTTP 访问统计。GitHub地址官网

安装

安装命令来自GoAccess官网

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 直接安装不是最新版,这里设置官方仓库,以便安装最新版
wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
sudo apt-get update
# 开始安装
sudo apt-get install goaccess
# 安装中文包
apt-get install language-pack-zh-hans
# 装好后使用以下命令检查是否有 zh_CN.utf8 了
locale -a
# 直接安装不是最新版,这里设置官方仓库,以便安装最新版 wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list sudo apt-get update # 开始安装 sudo apt-get install goaccess # 安装中文包 apt-get install language-pack-zh-hans # 装好后使用以下命令检查是否有 zh_CN.utf8 了 locale -a
# 直接安装不是最新版,这里设置官方仓库,以便安装最新版
wget -O - https://deb.goaccess.io/gnugpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/goaccess.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/goaccess.gpg arch=$(dpkg --print-architecture)] https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/goaccess.list
sudo apt-get update

# 开始安装
sudo apt-get install goaccess

# 安装中文包
apt-get install language-pack-zh-hans
# 装好后使用以下命令检查是否有 zh_CN.utf8 了
locale -a

nginx access.log 日志分析

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Web方式实时分析(要让 html 显示实时数据,需加 --real-time-html、--ws-url、--port这三个参数)
# 此外还需要修改 goaccess.conf,后面有讲到
goaccess -a -d -f /var/log/nginx/access.log -p /etc/goaccess/goaccess.conf -o /var/log/nginx/goaccess/report.html --real-time-html --ws-url=ws://192.168.1.200/goaccess --port=7890
# 控制台分析(不推荐)
goaccess -a -d -f /var/log/nginx/access.log -p /etc/goaccess/goaccess.conf
# Web方式实时分析(要让 html 显示实时数据,需加 --real-time-html、--ws-url、--port这三个参数) # 此外还需要修改 goaccess.conf,后面有讲到 goaccess -a -d -f /var/log/nginx/access.log -p /etc/goaccess/goaccess.conf -o /var/log/nginx/goaccess/report.html --real-time-html --ws-url=ws://192.168.1.200/goaccess --port=7890 # 控制台分析(不推荐) goaccess -a -d -f /var/log/nginx/access.log -p /etc/goaccess/goaccess.conf
# Web方式实时分析(要让 html 显示实时数据,需加 --real-time-html、--ws-url、--port这三个参数)
# 此外还需要修改 goaccess.conf,后面有讲到
goaccess -a -d -f /var/log/nginx/access.log -p /etc/goaccess/goaccess.conf -o /var/log/nginx/goaccess/report.html --real-time-html --ws-url=ws://192.168.1.200/goaccess --port=7890

# 控制台分析(不推荐)
goaccess -a -d -f /var/log/nginx/access.log -p /etc/goaccess/goaccess.conf

GoAccess默认就能解析 Nginx日志格式,对于控制台分析,首次启动时会弹出选择框,选 NCSA Combined Log Format 即可:

对于 Web 方式实时分析,则需要改 /etc/goaccess/goaccess.conf 配置,直接将下面三个地方的 # 去掉即可:

效果图:

nginx 静态资源配置

想通过 html 实时分析日志,还需要将 /var/log/nginx/goaccess/report.html 配置为 nginx 的静态资源,以便通过 web 访问:

/etc/nginx/conf.d/goaccess.conf:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
server {
listen 7880;
server_name 192.168.1.200;
# 参考:https://blog.csdn.net/chinabestchina/article/details/73556785
location /goaccess/report.html {
root /var/log/nginx/;
}
# 配置反向代理到内部的端口7890上
location /goaccess {
proxy_redirect off;
proxy_pass https://127.0.0.1:7890;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}
}
server { listen 7880; server_name 192.168.1.200; # 参考:https://blog.csdn.net/chinabestchina/article/details/73556785 location /goaccess/report.html { root /var/log/nginx/; } # 配置反向代理到内部的端口7890上 location /goaccess { proxy_redirect off; proxy_pass https://127.0.0.1:7890; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; } }
server {
    listen       7880;
    server_name 192.168.1.200;

    # 参考:https://blog.csdn.net/chinabestchina/article/details/73556785
    location /goaccess/report.html {
        root /var/log/nginx/;
    }

    # 配置反向代理到内部的端口7890上
    location /goaccess {
        proxy_redirect off;
        proxy_pass https://127.0.0.1:7890;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
    }
}

访问地址:http://192.168.1.200:7880/goaccess/report.html

启动参数

  • –daemonize:以守护进程方式启动
  • –ws-url:WebSocket 服务地址,用于实时显示日志
  • –port:WebSocket 服务端口,用于实时显示日志

log-format 参数

log-format 与 Nginx 日志 access.log 中的 log_format 格式对应,每个参数以空格或者制表符分割,参数说明如下:

  • %t 匹配 time-format 格式的时间字段
  • %d 匹配 date-format 格式的日期字段(date-format %d/%b/%Y)
  • %h host(客户端 ip 地址,包括 ipv4 和 ipv6)
  • %r 来自客户端的请求行
  • %m 请求的方法
  • %U URL 路径
  • %H 请求协议
  • %s 服务器响应的状态码
  • %b 服务器返回的内容大小
  • %R HTTP 请求头的 referer字段
  • %u 用户代理的 HTTP 请求报头
  • %D 请求所花费的时间,单位微秒
  • %T 请求所花费的时间,单位秒
  • %^ 忽略这一字段

实战经验

发现了百度蜘蛛 baiduspider 爬网频率高,导致流量消耗大

最近百度蜘蛛抓取频率巨大(尤其是 baiduspider-render/2.0),一天的传输量就达到1.7G。可通过 nslookup(nslookup 116.179.37.47)反查是否百度蜘蛛还是冒充的,若没问题则hostname以 *.baidu.com 或 *.baidu.jp 的格式命名,抽查了几个域名都没问题,下面是浏览器视角日志截图:

再去看百度爬虫频率配置,默认竟设置了8万次:

导致流量费较高,调小到2000次后,前两天降下来了,第三天频次又恢复到几万了,因此这不是主要原因。

实际上主要原因是我的前端代码 ajax 配置上设了 cache:false 导致的,这个设置直接的后果就是每次请求同一个接口,url后面都会携带 ?_=1712905979938 这种随机数来防止ajax缓存,致使百度爬虫认为是不同的请求,不停地爬同一个接口。当初加这个 cache:false 是为了修复因ajax域名使用CDN缓存加速,导致ajax返回的数据都一样这种场景。现在ajax请求的域名早已不再使用CDN加速了,因此 cache:false 根本就没必要,也不能加。

参考

使用 GoAccess 分析 Nginx 日志

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注