胖胖的枫叶
主页
博客
知识图谱
产品设计
数据分析
企业架构
项目管理
效率工具
全栈开发
后端
前端
测试
运维
数据
面试
  • openJdk-docs
  • spring-projects-docs
  • mysql-docs
  • redis-commands
  • redis-projects
  • apache-rocketmq
  • docker-docs
  • mybatis-docs
  • netty-docs
  • journaldev
  • geeksforgeeks
  • 浮生若梦
  • 后端进阶
  • 并发编程网
  • 英语肌肉记忆锻炼软件
  • 墨菲安全
  • Redisson-docs
  • jmh-Visual
  • 美团技术
  • MavenSearch
主页
博客
知识图谱
产品设计
数据分析
企业架构
项目管理
效率工具
全栈开发
后端
前端
测试
运维
数据
面试
  • openJdk-docs
  • spring-projects-docs
  • mysql-docs
  • redis-commands
  • redis-projects
  • apache-rocketmq
  • docker-docs
  • mybatis-docs
  • netty-docs
  • journaldev
  • geeksforgeeks
  • 浮生若梦
  • 后端进阶
  • 并发编程网
  • 英语肌肉记忆锻炼软件
  • 墨菲安全
  • Redisson-docs
  • jmh-Visual
  • 美团技术
  • MavenSearch
  • 博客

    • 博客迁移说明
    • 2024年
    • 2023年
    • 2022年
    • 2021年
    • 2020年
    • 2019年
    • 2018年

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。

END

Last Updated:
Contributors: 庆峰