分析命令:
goaccess -a -d -f /mnt/winshare/access-2023070112.log -p goaccess.conf -o /mydata/nginx/html/2023070112_new.html
分析日志时的参数
goaccess使用参数详解-a 开启 UserAgent 列表。开启后会降低解析速度
-c 在程序开始运行时显示 日志/日期 配置窗口
-d 输出 HTML 或者 JSON 报告时开启 IP 解析
-f 指定输入日志文件的路径
-p 指定使用自定义配置文件
面板统计含义:
官网描述:goaccess.io/man#description
界面测试统计地址(我本机)
Server Statistics
nginx 日志参数详解
参数 说明 示例
$remote_addr 客户端地址 172.17.0.1
$remote_user 客户端用户名称 --
$time_local 访问时间和时区 [29/Dec/2022:10:17:14 +0000]
$request 请求的URI和HTTP协议 "GET /test/nginx/proxy HTTP/1.1"
$http_host 请求地址,即浏览器中你输入的地址(IP或域名) 10.1.7.33
$status HTTP请求状态 200
$upstream_status upstream状态 200
$body_bytes_sent 发送给客户端文件内容大小 38
$http_referer url跳转来源 -
$http_user_agent 用户终端浏览器等信息 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
$http_cookie 用户cookie信息 "grafana_session=73d13d456cb4363f8a48f5501348669e"
$ssl_protocol SSL协议版本 TLSv1
$ssl_cipher 交换数据中的算法 RC4-SHA
$upstream_addr 后台upstream的地址,即真正提供服务的主机地址 "10.1.7.33:8102"
$request_time 整个请求的总时间 0.012
$upstream_response_time 请求过程中,upstream响应时间 0.012
重点说一下 request_time
$request_time是Nginx日志中的一个变量,表示请求处理时间,单位是秒,精度是毫秒。它反映了从Nginx开始接收客户端请求的第一个字节,到发送完响应数据给客户端的时间。这个时间包括了接收请求数据的时间、后端程序响应的时间、发送响应数据给客户端的时间,但不包括写日志的时间。
如果你想使用$request_time变量,你需要在Nginx的配置文件中设置log_format指令,定义你想要记录的日志格式。例如,你可以这样设置:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$request_time"';
这样,你就可以在每条日志中看到$request_time的值。例如:
192.168.1.100 - - [23/Sep/2023:10:15:32 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36" "-" "0.012"
这里,最后一个字段"0.012"就是$request_time的值,表示这个请求处理了12毫秒。
r e q u e s t t i m e 变量可以帮助你分析 N g i n x 的性能和吞吐量,以及后端程序的响应情况。你可以根据 request_time变量可以帮助你分析Nginx的性能和吞吐量,以及后端程序的响应情况。你可以根据 requesttime变量可以帮助你分析Nginx的性能和吞吐量,以及后端程序的响应情况。你可以根据request_time的值来判断哪些请求比较慢,是否有超时或错误发生,是否需要优化程序或调整配置等。
Nginx: PV、UV、独立IP
做网站的都知道,平常经常要查询下网站PV、UV等网站的访问数据,当然如果网站做了CDN的话,nginx本地的日志就没什么意义了,下面就对nginx网站的日志访问数据做下统计;
**UV(Unique Visitor):**独立访客,将每个独立上网电脑(以cookie为依据)视为一位访客,一天之内(00:00-24:00),访问您网站的访客数量。一天之内相同cookie的访问只被计算1次
**PV(Page View):**访问量,即页面浏览量或者点击量,用户每次对网站的访问均被记录1次。用户对同一页面的多次访问,访问量值累计
统计独立IP:00:00-24:00内相同IP地址只被计算一次,做网站优化的朋友最关心这个
goaccess中统计的指标参数解释
TX AMOUNT 是性能测试中的一个指标,表示每秒事务数(Transaction Per Second),也就是单位时间内系统能处理的事务数量。事务是指用户和系统之间的一次交互,比如登录、查询、支付等。TX AMOUNT 反映了系统的处理能力和吞吐量,与响应时间、并发数等指标有关。
HITS 是性能测试中的一个指标,表示Hits Per Second,也就是每秒请求数。HITS反映了系统的吞吐量,也就是单位时间内系统能处理的请求数量。HITS与TPS(每秒事务数)有一定的关系,但不完全相同。一个事务可能包含多个请求,比如一个网页可能包含多个图片、CSS、JS等文件的请求。因此,HITS一般会大于TPS。
AVG.T.S:Average Time Served,表示每个请求的平均服务时间,单位是秒。它反映了从Nginx开始接收客户端请求的第一个字节,到发送完响应数据给客户端的平均时间。这个时间包括了接收请求数据的时间、后端程序响应的时间、发送响应数据给客户端的时间,但不包括写日志的时间。
CUM.T.S:Cumulative Time Served,表示每个请求的累计服务时间,单位是秒。它反映了从Nginx开始接收客户端请求的第一个字节,到发送完响应数据给客户端的总时间。它是所有请求的AVG.T.S之和。
MAX.T.S:Maximum Time Served,表示每个请求的最大服务时间,单位是秒。它反映了从Nginx开始接收客户端请求的第一个字节,到发送完响应数据给客户端的最长时间。它是所有请求中最慢的一个。
要显示这三列,你需要在你的日志格式中包含服务时间字段,你可以使用%T
或%D
指定符来解析这个字段。 例如,如果你使用Apache的combined日志格式,你可以在字符串的末尾添加%D
来启用这三列。
标准配置
如何让goaccess统计出请求的服务时间?
配置nginx日志格式如下:
log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" ''$upstream_addr $request_time $upstream_response_time ';
配置goaccess log-format的格式如下
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" "%^" %^ %T %T
nginx日志输出格式如下
192.168.56.1 - - [14/Sep/2023:03:02:53 +0000] "GET /cc/ HTTP/1.1" 200 15567 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76" "-" 123.121.155.167:16002 0.433 0.432
192.168.56.1 - - [14/Sep/2023:03:02:56 +0000] "GET /cc/ HTTP/1.1" 200 15567 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76" "-" 123.121.155.167:16002 0.330 0.330
192.168.56.1 - - [14/Sep/2023:03:02:57 +0000] "GET /cc/ HTTP/1.1" 200 15567 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76" "-" 123.121.155.167:16002 0.367 0.367
以后goaccess 会支持到什么程度,以下是我在官网提出的问题并給出的答复
github.com/allinurl/goaccess/issues/2556
有关实际应用
问题:goaccess 如何做到自动分析 nginx日志,nginx日志是按天切割的。我如果想借助python去自动分析每天的日志,并输出每天的报告。并且也能通过界面的方式 分析某段时间的报告,比如将好几天的报告整合到一起 一并分析。下面提供一个详细的设计和开发方案
**回答:**goaccess是一款开源的实时Web日志分析工具,可以通过终端或浏览器查看Web服务器的统计信息。goaccess支持多种日志格式,包括nginx的日志格式,也可以自定义日志格式。goaccess可以生成静态的HTML报告,也可以生成实时的HTML报告,还可以生成JSON和CSV格式的报告。
要实现你的需求,我为你提供一个可能的设计和开发方案,如下:
-
第一步:编写python脚本。你需要编写一个python脚本,用于自动分析每天的nginx日志,并输出每天的报告。你可以参考
这篇文章
来了解如何使用python调用goaccess。你的脚本大致需要实现以下功能:
- 定义一个函数,用于根据日期获取对应的nginx日志文件名。例如,如果你的nginx日志是按天切割的,并且命名为
access.log-20210901
这样的格式,那么你可以根据日期参数拼接出文件名。 - 定义一个函数,用于根据日期获取对应的报告文件名。例如,如果你想生成HTML报告,并且命名为
report-20210901.html
这样的格式,那么你也可以根据日期参数拼接出文件名。 - 定义一个函数,用于调用goaccess命令,传入日志文件名和报告文件名作为参数,执行日志分析并输出报告。例如,你可以使用类似于
os.system('goaccess -f {} -o {} --log-format=COMBINED'.format(log_file, report_file))
这样的语句来执行goaccess命令。 - 定义一个主函数,用于遍历指定的日期范围,对每一天的日志进行分析,并生成每一天的报告。例如,你可以使用类似于
for date in pd.date_range(start_date, end_date):
这样的循环来遍历日期范围,并调用前面定义的函数来获取文件名和执行分析。
- 定义一个函数,用于根据日期获取对应的nginx日志文件名。例如,如果你的nginx日志是按天切割的,并且命名为
-
第二步:运行python脚本。你需要在服务器上运行你编写的python脚本,或者将其设置为定时任务,每天自动运行。5 这样就可以实现自动分析每天的nginx日志,并输出每天的报告了。
-
第三步:查看报告。需要在浏览器上查看生成的HTML报告,或者使用其他工具查看JSON或CSV格式的报告。12 如果你想通过界面的方式分析某段时间的报告,比如将好几天的报告整合到一起一并分析,那么你可以使用goaccess提供的增长日志处理功能。6 这个功能允许你将多个日志文件合并到一个数据库中,并从中生成一个综合报告。6
还会持续补充。。
志处理功能。](about:blank#)6 这个功能允许你将多个日志文件合并到一个数据库中,并从中生成一个综合报告。6
还会持续补充。。