GoAccess
GoAccess是一个基于终端的快速日志分析器。其核心思想是实时快速分析和查看Web服务器统计信息,而无需使用您的浏览器(如果您希望通过SSH快速分析访问日志,或者只是喜欢在终端中工作),终端输出是默认输出,但它能够生成完整的,独立的实时 HTML报告(非常适合分析,监控和数据可视化),以及a JSON和CSV报告。
- 数据持久性强,GoAccess能够通过磁盘上的B + Tree数据库逐步处理日志。
- GoAccess是用C语言编写的,要运行它,你只需要将ncurses作为依赖项,它甚至还具有自己的RFC6455兼容Web Socket服务器。
- 跟踪提供请求所需的时间。如果您想跟踪减慢网站速度的网页,则非常有用。
- GoAccess允许任何自定义日志格式字符串。预定义选项包括Apache,Nginx,Amazon S3,Elastic Load Balancing,CloudFront等。
- 所有面板和指标都定时在终端输出上每200毫秒更新一次,在HTML输出上每秒更新一次。
安装
yum install goaccess
- 如果提示错误:为仓库 'appstream' 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist
cd /etc/yum.repos.d/ sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
修改goaccess配置文件
[root@VM-12-14-centos ~]# whereis goaccess
goaccess: /usr/bin/goaccess /etc/goaccess /usr/share/man/man1/goaccess.1.gz
# 配置文件在/etc/goaccess里面
vim goaccess.conf
- 配置内容说明
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h - %^ [%d:%t %^]; "%r" %s %b "%R" - %^"%u" - %^ %T
- real-time-html 用来使用实时刷新特性。
- port 是用来和浏览器通信的,选一个没被占用的就行(别忘了在防火墙里开启端口)。
- 如果你不走 https 的话,ssl-cert,ssl-key,ws-url 都不是必需的。
- output:存放 goaccess 的站点目录。
- log-file:goaccess 的日志文件。
注意
三个 format 的设置要与 nginx 的设置一致
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 或者
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$connection $upstream_addr '
'$upstream_response_time $request_time';
format说明
log-format 与 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 请求所花费的时间,单位秒
%^ 忽略这一字段
- 可以使用 nginx2goaccess.sh 将 nginx 日志格式格式化为 goaccess 能识别的日志格式,nginx2goaccess.sh
sh nginx2goaccess.sh '<log_format>' #log_format为你nginx.conf中配置的日志格式
# 例子
bash nginx2goaccess.sh '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" $connection $upstream_addr $upstream_response_time $request_time'
- Console
将上述格式填写到 goaccess 配置文件中,先重启
nginx
之后再重启goaccess
即可。
time-format %T
date-format %d/%b/%Y
log_format %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" "%^" %^ %^ %^ %T
使用方法
冷日志分析
并不是实时数据,需要看的时候手动去生成对应的页面或者其他格式文件即可。
# /var/log/nginx/access.log 是nginx 默认的log位置,注意这个日志会按照日期切割。
goaccess -a -d -f /var/log/nginx/access.log --log-format=COMBINED -o nginx.html
# 输出一个nginx.html页面。
定时任务
可以通过定时任务更新输出html内容
# 创建脚本 nginx.sh编辑内容。
# 脚本执行。
#!/bin/bash
#页面转换为中文
LANG="zh_CN.UTF-8"
#输出HTML分析报告
goaccess -a -d -f /var/log/nginx/access.log --log-format=COMBINED -o nginx.html
- 创建定时任务
# 分配权限
chmod 755 /usr/local/goaccess/scripts/nginx.sh
crontab -e
#定时生成项目的nginx日志分析html报告
0 0 * * * /bin/bash /usr/local/goaccess/scripts/nginx.sh
实时日志查看
在goaccess.conf中,需要配置real-time-html true 、output 输出位置。
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h - %^ [%d:%t %^]; "%r" %s %b "%R" - %^"%u" - %^ %T
real-time-html true # 设置ture
port <port> # 端口号
ssl-cert <cert.crt> # https需要证书
ssl-key <priv.key> # https需要证书
ws-url wss://<your-domain>:<port>
output /usr/local/src/goaccess/index.html # 输出位置
log-file /usr/local/src/goaccess/goaccess.log #日志文件。
- 编辑nginx配置文件添加内容
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name goaccess;
#root /usr/share/nginx/html;
root /usr/local/src/goaccess;
# Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
- 演示并不做权限拦截,如果要使用权限拦截可以使用
htpassed
# 安装
yum -y install httpd-tools
# 设置用户名和密码,并把用户名、密码保存到指定文件中:
#例:htpasswd -c /etc/nginx/passwd you
htpasswd -c [passwfile] [username]
- 修改nginx配置文件
server {
listen 443 ssl;
location /goaccess {
#新增下面两行
auth_basic "Please input password"; #这里是验证时的提示信息
auth_basic_user_file /etc/nginx/passwd;
alias /usr/local/src/goaccess/nginx.html;
}
}
- 重启nginx,并访问/goaccess。