这篇文章原计划在 2020 年中智源大会举办完毕之后整理出来,奈何各种事情阻塞,一直拖延至今。恰逢年末跑一些数据,以及计划搭建一些日常辅助业务运营的实时看板,借着机会把内容整理出来。

本篇是第一篇,聊聊怎么使用 GoAccess 进行各种常见场景,进行常规日志行为数据分析。

写在前面

面对几个G、甚至上百 GB 的原始日志,如果我们想进行分析,除了导入 ELK、ClickHouse 、云服务日志 SaaS 系统之外,其实使用轻巧的 GoAccess就可以满足多数基本分析要求。

针对日志进行基础处理

不论使用哪一种工具进行日志分析,在分析前,我们首先要准备合理、正确的数据源。如果你的日志是由 Nginx 、Apache 输出,类似下面这样:

那么可以直接跳到下一节进行实战了解。但是如果你的日志并非单纯由结构化的内容构成,混杂了一些其他的信息,我们则需要进行一些清理,比如在 Nginx 1.19 版本中,我们得到的默认日志输出会是这样:

可以看到,除了预期内的日志内容外,还有一些意料之外的文本输出内容,这些内容,GoAccess 默认是无法解析的,所以需要进行日志的“简单清洗”,处理掉这些程序不支持的数据。

如果你能够确保日志只有头部有这些信息,并且可以确认出现的内容行数数量,可以使用 tail 命令来“跳过”指定的行数,来确保日志结构一致:

但是如果你无法确保这些“意外”的日志会出现在哪里,出现的次数有多少,则需要使用 grep 进行符合内容的日志的筛选,比如我们要筛选出 2020 年的访问请求:

有的时候,我们的应用会给原本的访问日志进行一些修改,比如在日志头或尾部添加一些内容,类似下面这样:

那么我们首先要使用 cutawk 对原始数据中的不必要数据进行剔除,比如剔除掉每行行首的 ngx-logs_1 |,并对每行内容进行 trim 操作:

此外,因为一些特殊情况,比如测试,或者日志切分导出时间有重合,我们可能面临数据有重复的情况,也需要使用 uniq 进行数据去重:

基本操作就讲到这里,本篇文章先以个人网站小样本日志(几G)为例,聊聊实际如何处理日志并使用 GoAccess 进行分析。

处理 Nginx 访问日志

我的网站是运行在 Nginx 容器中的静态站点。在网站简要说明中有提到,在 2018 年后,我重新在阿里云上搭建了这个网站,两年以来,在更新软件版本的时候,我会执行手动日志导出,因为软件版本不同,以及导出方式不同,所以文件格式会有一些差异,如同上一小节提到的那样,和经历多次架构调整的真实业务场景类似:

首先对日志类型进行分类,并进行重命名整理:

然后将相同格式的文件进行合并以及数据去重,以及使用 awk 去掉每行日志中的容器名称,例如:

接着使用 du 查看文件,发现相比较原始文件,新日志文件确实尺寸小了不少,更小的文件可以减少程序接下来的分析计算时间:

在进行分析之前,还需要进一步对其两种日志数据格式:

通过观察可以看到,两种数据格式在 UA 之前的内容完全一致,而 UA 后的数据,我们几乎不需要,所以这里可以再次对日志进行清洗,摘除 UA 字段后的信息,将日志格式完全对齐。

针对 Nginx 格式删除最后一个字段,使用 awk 基础模式即可:

针对 Traefik 格式需要删除最后四个字段,mac 自带的 awk 需要换成 gawk,并使用指定FPAT,忽略双引号内的分隔符:

处理完毕后,可以看到日志尺寸进一步缩小。

最后使用 grep 对日志进行拆分,合并相同时间段的日志,接下来就可以进行分析了。

按月拆分日志

如果需要按月拆分,加速处理、或者做更细节的分析,可以考虑使用下面的方案:

使用 GoAccess 分析 Nginx 日志

使用 GoAccess 有几个注意事项,如果不是在容器内使用,尤其是 Mac 用户,需要声明 LANG ,避免程序解析异常,下面是针对 Nginx 日志格式的分析命令参考。(日志格式、时间和日期格式已配置好,直接使用就可以啦):

顺利的话,你将看到程序在以每秒几万条速度以上进行文件处理。

执行完毕,就能够看到报告了。

GoAccess 默认统计部分界面

其他软件/平台日志格式

如果你使用的软件不是文中提到的 Nginx,可以参考官方文档进行日志定义。

给出一个曾经使用过的 SAE 的平台的日志格式:

使用 GoAccess 进行实时分析

GoAccess 除了能够分析静态日志外,还能够支持动态日志,添加几个监听参数后,将输入修改为程序运行中使用的日志,即可获得一个实时更新的报告文件。

但需要注意的是,GoAccess 本身并不提供 Web Server 相关能力,仅支持 WebSocket Server 功能,其输出的报告文件仅为一个静态文件,如果需要拿他作为实时日志看板,需要在前面添加拥有 Web Server 能力的软件,比如:Nginx、Apache。

最后

暂且写到这里,后续展开聊聊如何处理大文件,以及结合容器搭建轻量的实时访问看板。

–EOF