首页 > 系统相关 >使用 GoAccess 分析 Nginx 日志

使用 GoAccess 分析 Nginx 日志

时间:2024-03-26 19:44:42浏览次数:22  
标签:GoAccess goaccess log format -- Nginx HTML 日志

来源:https://cloud.tencent.com/developer/article/1449085

 

GoAccess 是一款开源的且具有交互视图界面的实时 Web 日志分析工具,通过你的 Web 浏览器或者 *nix 系统下的终端程序 (Terminal) 即可访问。

GoAccess 能为系统管理员提供快速且有价值的 HTTP 访问统计,并以在线可视化服务器的方式呈现。

GoAccess 官网:https://goaccess.io

安装 GoAccess

1. 通过包管理器安装

  • Debian / Ubuntu
$ echo "deb http://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/goaccess.list
$ wget -O - https://deb.goaccess.io/gnugpg.key | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install goaccess
  • Fedora
 $ yum install goaccess
  • Arch Linux
 $ pacman -S goaccess
  • Gentoo
 $ emerge net-analyzer/goaccess
  • OS X / Homebrew
 $ brew install goaccess

2. 通过源代码安装

这里以 CentOS / RHEL 为例,其它版本方法也基本类似,区别在于需安装依赖软件包的包名不同而已。

  • 安装依赖软件包
$ yum install glib2 glib2-devel GeoIP-devel  ncurses-devel zlib zlib-devel
  • 编译安装 GoAccess
$ wget https://tar.goaccess.io/goaccess-1.3.tar.gz
$ tar -xzvf goaccess-1.3.tar.gz
$ cd goaccess-1.3/
$ ./configure --enable-utf8 --enable-geoip=legacy
$ make
$ make install

更多安装方式,可参考官方文档:https://goaccess.io/download#installation

GoAccess 常用命令参数

$ goaccess -h

-a --agent-list 启用由主机用户代理的列表。为了更快的解析,不启用该项。
-d --with-output-resolver 在 HTML/JSON 输出中开启 IP 解析,会使用 GeoIP 来进行 IP 解析。
-f --log-file 需要分析的日志文件路径。
-p --config-file 配置文件路径。
-o --output 输出格式,支持。html、json、csv。
-m --with-mouse 控制面板支持鼠标点击。
-q --no-query-string 忽略请求的参数部分。
--real-time-html 实时生成 HTML 报告。
--daemonize 守护进程模式,--real-time-html 时使用。

配置 GoAccess

GoAccess 的主要配置文件为 goaccess.conf,主要配置参数有以下几项:

time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

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

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

使用 GoAccess

基本用法

1. 在终端模式下运行 GoAccess

$ goaccess -a -d -f /var/log/nginx/hi-linux.com.access.log -p /etc/goaccess.conf

第一次使用 GoAccess 的时候,会弹出下面的对话框,要求配置 access_log 的时间和日志格式。 Nginx 默认的日志格式就是 NCSA, 所以一般就选第一个就可以了。

日志格式选中 NCSA Combined Log Format 并回车后, GoAccess 分析日志完成后会在终端上显示分析结果。

控制台下 GoAccess 的操作方法

F1   主帮助页面
F5   重绘主窗口
q    退出
1-15 跳转到对应编号的模块位置 
o    打开当前模块的详细视图
j    当前模块向下滚动
k    当前模块向上滚动
s    对模块排序
/    在所有模块中搜索匹配
n    查找下一个出现的位置
g    移动到第一个模块顶部
G    移动到最后一个模块底部

2. 在 HTML 模式下运行 GoAccess

默认情况下,GoAccess 是运行在控制台模式下的,也就是在命令行里直接输出结果。

为了更方便的访问分析结果,我们可以通过 GoAccess 的 HTML 模式将分析结果页面保存为 HTML,然后通过浏览器访问。

要让 GoAccess 在 HTML 模式下运行,我们则需要配置下 GoAccess 的配置文件。

$ cat goaccess.conf
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
  • 通过命令行运行 GoAccess 的 HTML 模式
$ goaccess -a -d -f /var/log/nginx/hi-linux.com.access.log -p /etc/goaccess.conf -o /var/log/nginx/goaccess.html
  • 通过 Daemonize 模式运行 GoAccess 的 HTML 模式

在命令行下运行 GoAccess 的 HTML 模式所产生分析结果文件并不是实时的,如果我们要产生实时的 HTML 分析页面又应该如何做呢?

GoAccess 已经为我们考虑到这点了,我们可以以 Daemonize 模式来运行,并提供创建实时 HTML 的功能。要实时输出 HTML 格式的分析结果,只需要在启动命令时加入 --real-time-html 和 --daemonize 参数即可。

$ goaccess -a -d -f /var/log/nginx/hi-linux.com.access.log -p /etc/goaccess.conf -o /var/log/nginx/goaccess.html --real-time-html --daemonize

以守护进程启动 GoAccess 后,使用 Websocket 建立了长连接。它默认监听 7890 端口,如果需要自定义,可以通过 --port 参数指定端口号。

# 查看 GoAccess 的监听端口 7890
$ netstat -tunpl | grep "goaccess"
tcp   0   0 0.0.0.0:7890      0.0.0.0:*     LISTEN      21136/goaccess
  • 通过 Crontab 运行 GoAccess 的 HTML 模式

在某些场景下,也许我们没有这样高的实时性要求,也可以采用 Crontab 机制来实现定时更新 HTML 报表。

$ crontab -e
# 每 30 分钟执行
30 * * * * goaccess -a -d -f /var/log/nginx/hi-linux.com.access.log -p /etc/goaccess.conf -o /var/log/nginx/goaccess.html 2> /var/log/nginx/goaccess.log

高级用法

  • 让 GoAccess 支持自定义的日志格式

GoAccess 也是支持日志格式定制的,比如现在绝大部分 Nginx 可能都会包括 vhost,即一个物理 Nginx 服务器可以支持多个域名的虚拟主机,但是 Nginx 默认的 NCSA 日志格式在 /etc/nginx/nginx.conf 配置中是不包括 vhost 字段, 所以我们就无法在报表中区分不同虚拟主机的请求。

Nginx 默认的 NCSA 日志格式

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for" ';

为了支持 vhost,可以 Nginx 的 log_format 定制成下面这个样子, 主要是添加了 $server_name 字段用来显示 vhost, 还有末尾的 $xxx_time, 用来显示每个请求的耗时。

log_format main '[$time_local] $remote_addr $server_name "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for" '
                '$upstream_addr $request_time $upstream_response_time';

为了让 GoAccess 能适配这个格式,需要将 goaccess.conf 中修改成如下格式:

# NCSA Combined Log Format
log-format %^[%d:%t %^] %h %v "%r" %s %b "%R" "%u"

其中,具体的指示符号可以参考 GoAccess 的官方文档, 比如 %^ 代表忽略对应的字段。

  • 通过管道让 GoAccess 更灵活的处理输入

GoAccess 还可以从管道支持输入,这样可以做一些更灵活的处理。比如:access_log 日志中的 request 字段并不包括 server_name。为了让 request 能够包含完整的 url, 我们可以用下面的命令:

$ awk '$6=$4$6' access.log | goaccess -a -

因为 awk 的第 4 列包含了 server_name, 这个命令将 server_name 放到了 request 的前面组成了完整的 url,再将结果用作 GoAccess 的输入。

参考文档

https://www.google.com http://t.cn/RKwsKkv

http://t.cn/E9UFxfF http://t.cn/E9Usnb1

http://t.cn/E94vqcJ

http://t.cn/E9473TF

标签:GoAccess,goaccess,log,format,--,Nginx,HTML,日志
From: https://www.cnblogs.com/gaoyanbing/p/18097416

相关文章

  • nginx为什么在二级目录访问
    很多时候感觉对了但是就是404二级动态代理可能是多一个斜杠//错误代理//“/”结尾在URL处,表示反向代理时不是“https://www.xxxxxxx.com/proxyname/”,//而是“https://www.xxxxxxx.com/”,否则容易出现404的情况location/proxyname/{proxy_passhtt......
  • NLog使用和日志上传指定服务器
    背景之前使用的log4net进行日志的记录,但是找过相关资料之后发现log4net不支持根据指定的配置将不同类的日志写入到不同的文件中为了后续的运维需要需要将日志上传至上层平台的接口,方便后续的日志查看解决问题将日志进行分类存放,防止日志都在同一个文件中,难以针对性的进行日......
  • SpringBoot+Aop实现业务操作日志demo
    1、建表CREATETABLE`business_log`(`id`bigintNOTNULLAUTO_INCREMENT,`name`varchar(100)NULLCOMMENT'业务名称',`description`varchar(255)NULLCOMMENT'业务操作描述',`operator`varchar(100)NULLCOMMENT'操作人',`oper_t......
  • 三月二十六日 安卓打卡app开发日志
    今天上午将打卡逻辑代码优化了一下 之后每天就只可以打卡一次了 publicstaticStringdaka(Stringtime_s,Stringtime_e,Stringtext,Stringaccount){Connectionconnection=JDBCUtils.getConn();try{if(connection!=null){......
  • 主nginx和子nginx-------域名-端口-解答
    主nginx和子nginx-------域名-端口-解答想象一下Nginx是一个接待员,每个端口就像接待员的一个电话线,而server_name就像是客户拨打的不同号码。当你在Nginx配置文件里设定端口(比如80或81),就相当于告诉接待员:“请守在这一条电话线上接听来电。”如果只有一个电话线(端口),但是你告......
  • Nginx配置SSL证书
    SSL证书介绍SSL(SecureSocketsLayer)是一种用于保护在Internet上进行数据传输的加密协议。它是一种为网络通信提供安全性的协议,最初由网景公司(Netscape)开发。SSL的目标是通过对数据进行加密和身份验证,确保敏感信息在用户与网站之间的传输中得到保护。SSL通过在通信的两端之......
  • 【插件更新日志】新发布的1.5.0版本插件中的增强模式,作用几何?
    近日,我们的插件迎来了自发布以来的首个大更新,发布了1.5.0版,更新了多个新特性,今天就带您来了解一下其中的【增强】模式。一、令人头疼的兼容性问题如上图所示,这是在MTK天玑7200-Ultra芯片下测试同一人体姿态识别的效果,未开启【增强】模式时,识别出的关键点错位严重,根本无法使......
  • Java服务器开发的日志:日志的作用和使用方法;日志文件的定期归档、清理和滚动策略;ELK(又
    Java服务器开发的日志Java服务器开发,为什么要使用日志?应该怎样使用日志?在Java服务器开发中使用日志是非常关键的一个实践,原因如下:本文所说的“日志”,主要是指程序运行时生成的技术日志;它在Java服务器开发中的作用和使用方法如下:故障诊断:技术日志主要用于记录程序运......
  • MySQL 数据库的日志管理、备份与恢复
    一.数据库备份1.数据备份的重要性 备份的主要目的是灾难恢复。在生产环境中,数据的安全性至关重要。任何数据的丢失都可能产生严重的后果。造成数据丢失的原因:程序错误人为,操作错误,运算错误,磁盘故障灾难(如火灾、地震)和盗窃.容灾概念:容灾(DisasterRecovery,DR)......
  • 使用Docker快速搭建Web服务器Nginx
    简介在现代Web开发中,Nginx作为一款高性能的Web服务器和反向代理服务器,被广泛应用于各种项目中。而使用Docker可以极大地简化服务器的部署和管理过程。本文将介绍如何利用Docker快速搭建NginxWeb服务器,并简要说明一些常见的配置和使用方法。第一步:拉取镜像在拉取镜像时,我们可......