使用goaccess实时分析Caddy日志
前几天我用 nginxpulse 做日志分析的时候,发现了一些问题,比如手机或者平板访问 UI 会错乱,"访问明细"页几乎没法看,于是想着部署个 goaccess 试试看。
要在 Caddy 下实现多域名实时访问,网上还没什么比较好的示例,下面记录我的踩坑过程。
1. 安装 GoAccess
强烈建议源码安装,因为各 Linux 发行版仓库带的版本低于 GoAccess 的当前版本,会导致部分功能受限。
比如我遇到的情况是:Debian 上的版本过低,导致 Geo Location 面板上就没有 World Map、Azimuthal/Globe 选项,效果和官方 demo 比,可以说是天差地别,前者会显示一幅标准 2D 世界地图,
后者会显示一个 3D 世界地图。
此外,源码安装,也最好直接从官网下载源码包:
1$ wget https://tar.goaccess.io/goaccess-1.9.4.tar.gz
2$ tar -xzvf goaccess-1.9.4.tar.gz
3$ cd goaccess-1.9.4/
4$ ./configure --enable-utf8 --enable-geoip=mmdb --with-openssl
5$ make
6# make install
从 github 下载包,会遇到没有 configure 程序的问题,别问我怎么知道,踩过坑。
如果编译报错,大概率是缺了 Ncursesw 相关依赖,按提示搜索,安装发行版对应的包就好。官方 https://goaccess.io/download 页有介绍。
2. 配置解析 Caddy 日志文件
所谓日志分析,就是解析日志,然后重新聚合展示。
直接看我的配置(过滤了注释行、空行和 static-file|no 开头的行,方便查看关键信息):
1root@tokyo:~# egrep -v "^#|^$|^static|^no" /etc/goaccess/goaccess.conf
2date-format %s
3log-format {ts:"%x.%^",request:{remote_ip:"%h",proto:"%H",method:"%m",host:"%v",uri:"%U",headers:{"User-Agent":["%u","%^"]},tls:{cipher_suite:"%k",proto:"%K"}},duration:"%T",size:"%b",status:"%s",resp_headers:{"Content-Type":["%M;%^"]}}
4log-format CADDY
5config-dialog false
6hl-header true
7json-pretty-print false
8tz Asia/Shanghai
9with-mouse false
10addr 127.0.0.1
11daemonize true
12real-time-html true
13ws-url wss://goaccess.xxx.com:443/ws
14log-file /var/log/caddy/xxx.com.cc.log
15agent-list false
16with-output-resolver false
17http-method yes
18http-protocol yes
19output /data/goaccess/xxx.com.html
20444-as-404 false
214xx-to-unique-count false
22all-static-files false
23double-decode false
24ignore-crawlers false
25crawlers-only false
26unknowns-as-crawlers false
27real-os true
28geoip-database /usr/share/GeoIP/GeoLite2-City.mmdb
29geoip-database /usr/share/GeoIP/GeoLite2-ASN.mmdb
关键点配置:
- date-format %s Caddy 需要
- log-format 开头的两个配置,一个做
CADDY JSON Structured解析的;log-format CADDY告诉 GoAccess 当前的日志类型为 Caddy - tz Asia/Shanghai 时区设置,看个人喜好了
- addr 127.0.0.1 关键,安全相关配置,建议本地监听,通过代理转发出去
- real-time-html true 开启网页实时刷新,GoAccess 会通过 websocket 刷新数据
- ws-url wss://goaccess.xxx.com:443/ws 真实 websocket 响应接口,很关键。这个地方配置错误的话,可通过浏览器调试窗口排查
- log-file /var/log/caddy/xxx.com.cc.log 需要分析的目标日志文件
- output /data/goaccess/xxx.com.html 生成的 html 文件,浏览器最终查看访问的是这个
- geoip-database /usr/share/GeoIP/GeoLite2-City.mmdb IP 地址精确到城市,需要额外 IP 地址库
- geoip-database /usr/share/GeoIP/GeoLite2-ASN.mmdb 好像是网络运营商信息,比如
AT&T Services, Inc.、Chinanet等
监听端口也可按需修改,默认是:port 7890
GeoLite2 相关数据库文件去这里下载:https://github.com/P3TERX/GeoLite.mmdb
systemd 文件配置:
1root@tokyo:~# systemctl cat goaccess.service
2# /etc/systemd/system/goaccess.service
3[Unit]
4Description=GoAccess Real-Time Log Analyzer
5After=network.target caddy.service
6
7[Service]
8User=root
9ExecStart=/usr/local/bin/goaccess -p /etc/goaccess/goaccess.conf
10Type=forking
11Restart=on-failure
12RestartSec=5
13StartLimitBurst=5
14StartLimitInterval=30s
15
16[Install]
17WantedBy=multi-user.target
注意其中的 Type=forking,不然没法正常启动。或者你不配置 daemonize true,那这一行也可以去掉,主进程会在启动时 fork 出一个子进程,然后父进程退出,而子进程继续在后台运行时才需要 Type=forking。
3. 配置 Caddy 访问输出页
请看配置
1logs.xxx.com {
2 encode zstd br gzip
3 root * /data/goaccess
4 file_server
5 basic_auth {
6 your_username your_hash_password # caddy hash-password
7 }
8 reverse_proxy /ws localhost:7890
9 reverse_proxy /ws_another localhost:7891 # 多个域名日志分析,如果想分实例解析
10}
这样浏览器就能通过 https://logs.xxx.com/xxx.com.html 访问实时刷新的日志。
如果遇到实时刷新错误,F12 打开浏览器调窗口,搜索 ws,看是否报错,response 中数据是否正常刷新,按报错提示处理。
截图示例操作如下:
4. 多域名日志配置
如果你有多个域名,分别写日志到不同路径,比如 foo.xxx.com.log、bar.xxx.com.log,还想多页面独立查看。
可以考虑分 2 个 goaccess 实例处理的。监听端口分开下,Caddy 代理像上面所示的那样,分别代理到不同端口。
还可以让 AI 帮你写个 index.html, 实现路由到不同页面的逻辑,再把 index.html 放到 root * /data/goaccess 指示的 root 目录中,我就是这么做的,很方便的。
5. 最终效果图
截图示例:
可以看出 ASN 和 Geo Location 都正确显示了,老实说,首次配置的话,还是要花点时间摸索的。
用手机或者电脑访问下被解析日志站点,数据就能实时刷新。
不想部署,只想看看效果的,也可以直接去 goaccess 官网看其提供的 live demo 页。
不管是 nginxpulse 还是 goaccess 目前都不能直接查看原始日志,毕竟轻量工具,不能和企业级的大型日志系统 OpenObserve、ELK 等相比,适用场景不一样,成本也千差万别。

版权申明:
- 未标注来源的内容全部为原创,未经授权请勿转载(因转载后排版往往错乱、内容不可控、无法持续更新等);
- 非营利为目的,演绎本博客任何内容,请以'原文出处'或者'参考链接'等方式给出本站相关网页地址(方便读者)。
相关文章:
- 个人网站监控
- Hysteria科学上网简要
- 简单获取celery任务实时结果
- Caddy日志配置轮转和格式化
- Caddy2 Vue history 模式配置
- Hugo全站AVIF记
- Linux下尝试使用Godot开发小游戏
- Arch linux dae 透明代理
- Airflow接管galler-dl下载任务
- 如何使用gallery-dl批量下载图像