日志处理

1.功能说明

1.1 概述

GoAccess 是一款基于终端的日志分析工具。其核心理念是不需要通过 Web 浏览器就能快速分析并实时查看 Web 服务器的统计数据。

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

可以为系统管理员提供快速且有价值的 HTTP 统计,并以在线可视化服务器的方式呈现。GoAccess解析指定的Web日志文件并将统计结果输出到X终端。

终端输出仅仅是默认的输出方式,GoAccess 还支持生成完整的实时 HTML 报告(这对分析、监控以及数据可视化都是极好的),以及 JSON 和 CSV 格式的报告。

1.2 详细功能

  • 通用统计: 此面板展示了几个主要指标,比如:有效和无效请求的数量,分析这些数据所花费的时间,独立访客的情况,请求的文件,静态文件(CSS, ICO, JPG 等)的完整URL,404错误,被解析的日志文件的大小以及消耗的带宽。
  • 独立访客: 此面板按照日期展示了访问次数,独立访客数,以及累计消耗的带宽等指标。具有相同IP,相同访问时间,相同的 UserAgent 的 HTTP 请求将会被识别为独立访客。默认情况下包含了网络爬虫。 您也可以选择使用 –date-spec=hr 参数将按照日期分析修改为按照小时,例如:05/Jun/2016:16 。这对于希望在小时级别去跟踪每日流量非常有帮助。
  • 请求的文件: 此面板展示您服务器上被请求次数最多的文件。包含访问次数,独立访客数,百分比,累计消耗带宽,使用的协议,请求方式。
  • 请求的静态文件: 列出请求频率最高的静态文件类型,例如: JPG, CSS, SWF, JS, GIF, 和 PNG , 以及和上一个面板一样的其他指标。 另外静态文件可以被添加到配置文件中。
  • 404 或者文件未找到: 展示内容与之前的面板类似,但是其数据包含了所有未找到的页面,以及俗称的 404 状态码。
  • 主机: 此面板展示主机自身的详细信息。能够很好的发现不怀好意的爬虫以及识别出是谁吃掉了你的带宽。 扩展面板将向您展示更多信息,比如主机的反向DNS解析结果,主机所在国家和城市。如果开启了 参数,选择想查看的 IP 地址并按回车,将会显示 UserAgent 列表。
  • 操作系统: 此面板将显示主机使用的操作系统的信息。GoAccess 将尽可能尝试为每一款操作系统提供详细的信息。
  • 浏览器: 此面板将显示来访主机使用的浏览器信息。GoAccess 将尽可能尝试为每一款浏览器提供详细的信息。
  • 访问次数: 此面板按小时报告。因此将显示24个数据点,每一个均对应每一天的某一个小时。 使用 –hour-spec=min 参数可以设定为按每十分钟报告,并将以 16:4 的格式显示时间。这对发现服务器的峰值访问时段很有帮助。
  • 虚拟主机**:** 此面板将显示从访问日志中解析出来的不同的虚拟主机的情况。此面板仅在日志格式中启用了 %v 参数时显示。
  • 来路站点: 此面板将仅显示主机的部分,而不是完整的URL。
  • 地理位置: 根据 IP 地址判断地理位置。统计数据按照大洲和国家分组。需要地理位置模块的支持。
  • HTTP 状态码: 以数字表示的 HTTP 请求的状态编码。
  • 远程用户(HTTP验证) 通过 HTTP 验证来确定访问文档的权限。如果文档没有被密码保护起来,这部分将会显示为 “-”。此面板默认为开启,除非在日志格式变量中设置了参数 %e

注意: 如果配置了可选项,所有面板将显示处理请求的平均时间消耗。

2. 依赖模块

本功能依赖njet.conf配置文件中的njt_http_access_log_zone_module.so和njt_helper_access_data_module.so:

helper ctrl modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf;
helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
helper access_data modules/njt_helper_access_data_module.so conf/goaccess.conf;

load_module modules/njt_agent_dynlog_module.so;

load_module modules/njt_http_access_log_zone_module.so;

以及njet_ctrl.conf配置文件中的njt_http_sendmsg_module.so模块。

load_module modules/njt_http_sendmsg_module.so;

3. 指令说明

3.1 njet.conf数据面指令

3.1.1 access_log_write_zone

Syntax: access_log_write_zone [on/off];
Default:
Context: http,server,location

access_log_write_zone : 开启日志统计,不依赖access_log 的开关(access_log on;),可以控制到location。

例如:access_log_write_zone on;

说明:配置access_log_write_zone on后,即使access_log配置为off,或者通过动态accesslog接口,修改对应路径的accesslog为off,也可以进行数据统计记录。相反,配置access_log_write_zone off后,access_log配置为on或者通过动态accesslog接口,修改对应的accesslog为on,也不会被记录。

3.1.2 access_log_zone

Syntax: access_log_zone name size.
Default:
Context: http

name:共享内存的名字。

size: 共享内存大小。

例如: access_log_zone abc 1m;

说明:access_log_zone未配置goaccess数据统计功能不能生效。

3.1.3 access_log_zone_valid

Syntax: access_log_zone_valid days
Default:
Context: http

days: 统计日志保存的天数。

例如: access_log_zone_valid 3;

3.1.4 access_log_zone_ignore_ip ip

Syntax: access_log_zone_ignore_ip ip 支持多条指令
Default:
Context: http

ip: 忽略统计的ip 或 ip 段。

例如:access_log_zone_ignore_ip 127.0.0.1;

例如:access_log_zone_ignore_ip 127.0.0.1-127.0.0.7;

3.1.5 access_log_db_path path;

Syntax: access_log_db_path path;
Default:
Context: http

例如:access_log_db_path logs/goaccessdb;

说明:goaccess数据持久化,配置后当stop/reload时会在对应路径生成数据文件,将统计数据持久化。

3.2 goaccess.conf常用指令

output html/report/report.html    #输出到标准输出或指定的文件。 格式可配置为json,csv,html

output html/report/report.json    #输出到标准输出或指定的文件。 格式可配置为json,csv,html

output html/report/report.csv    #输出到标准输出或指定的文件。 格式可配置为json,csv,html

real-time-html true   #启用实时 HTML 输出。

html-refresh 10s   #定每隔多少秒刷新一次 HTML 报告。这个参数可以让你在实时监控日志时保持报告的更新。

4.配置样例

4.1 njet.conf数据面配置:

worker_processes auto;

cluster_name njet;
node_name node1;

user root root;
error_log logs/error.log info;

helper ctrl modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf;
helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
helper access_data modules/njt_helper_access_data_module.so conf/goaccess.conf;

load_module modules/njt_agent_dynlog_module.so;

load_module modules/njt_http_access_log_zone_module.so;

events {
    worker_connections  1024;
}


http {
    include mime.types;
    
    access_log_zone  abc 1m;
    
    access_log_zone_ignore_ip  127.0.0.1;
    
    access_log_zone_valid  3; 
    
    upstream backend1  {

         zone backend1 128k;

         server 192.168.40.150:5678;

    }

    server {
    
        server_name   localhost;
        listen       8080;
        location / {

             proxy_pass http://backend1;
        }

        location /test {
            
            proxy_pass http://backend1
        }

    }

 }

4.2 ctrl.conf控制面配置:

load_module modules/njt_http_sendmsg_module.so;
load_module modules/njt_ctrl_config_api_module.so;
load_module modules/njt_doc_module.so;


events {
    worker_connections  1024;
}
error_log         logs/error_ctrl.log info;

http {
    dyn_sendmsg_conf  conf/iot-ctrl.conf;
    access_log        logs/access_ctrl.log combined;

    include           mime.types;

    server {
        listen       5051;
        location /doc {
            doc_api;
        }

        location /api {
            dyn_module_api;
        }

        location /report/ {             #配置输出报告存放路径
             root html;
         }
         
         location /ws {                 #前端获取实时状态信息端口7890
             proxy_pass http://127.0.0.1:7890;
        }
  }

}

4.3 goaccess.conf配置:

output html/report/report.html

real-time-html true

5 功能展示

访问http://127.0.0.1:5051/report/report.html 查看实时HTML报告:

img img

当有请求时:

img img

访问http://127.0.0.1:5051/report/report.json 查看Json报告:

img img

访问http://127.0.0.1:5051/report/report.csv 查看csv报告:

img img

6.调用样例

6.1 配置access_log_write_zone on后,检查数据统计

使用curl访问location /test

curl -v http://127.0.0.1:5555/test

返回值

* processing: http://127.0.0.1:5555/test
*   Trying 127.0.0.1:5555...
* Connected to 127.0.0.1 (127.0.0.1) port 5555
> GET /test HTTP/1.1
> Host: 127.0.0.1:5555
> User-Agent: curl/8.2.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: njet/3.0.1
< Date: Wed, 17 Jul 2024 07:18:27 GMT
< Content-Type: text/plain
< Content-Length: 6
< Connection: keep-alive
< 
* Connection #0 to host 127.0.0.1 left intact
OK1111

此时查看实时HTML报告:

img img

http块中配置access_log_write_zone on后,location中配置access_log_write_zone off,此时访问location并检查数据统计

使用curl访问location /test

curl -v  http://127.0.0.1:5555/test

返回值

* processing: http://127.0.0.1:5555/test
*   Trying 127.0.0.1:5555...
* Connected to 127.0.0.1 (127.0.0.1) port 5555
> GET /test HTTP/1.1
> Host: 127.0.0.1:5555
> User-Agent: curl/8.2.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: njet/3.0.1
< Date: Wed, 17 Jul 2024 07:18:27 GMT
< Content-Type: text/plain
< Content-Length: 6
< Connection: keep-alive
< 
* Connection #0 to host 127.0.0.1 left intact
OK1111

此时查看实时HTML报告:

img img

访问该location的数据未被统计。

6.2 goaccess数据持久化

Njet stop后,再次启动,查看页面,数据会依然留存。

img img