为了查看本站点的健康状况以及用户访问情况,就需要定期的分析服务器的 access 日志。但是由于没有使用日志分析工具,只能使用 cat、awk、sed 等命令做一些简单的日志分析统计,这样分析结果不理想也不全面,方法也极不高效。作为个人站点更适合引入轻量级的日志分析工具,例如 GoAccess ,其使用简单且分析效果较好

1、安装giaccess yum -y install goaccess 安装完成后,默认配置文件路径:/etc/goaccess.conf

2、修改配置文件,在配置文件的末端添加

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

其中,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  请求所花费的时间,单位秒
%^  忽略这一字段

3、使用脚本定时分析日志 这里分析的是前一天的日志

#!bin/bash
cd /root/fzrz/121-fzrz/
day=`date -d '-1 days'| awk '{print $3}'`
month=`date -d '-1 days'| awk '{print $2}'`
year=`date -d '-1 days'| awk '{print $6}'
date=`date -d '-1 days' '+%Y%m%d'`
LJ=/home/bianla_lee/jkdays/`date -d '-1 days' '+%m-%d'`
mkdir  $LJ

wget  ftp://192.168.20.121/pub/access.$date.log.gz
gunzip  access.$date.log.gz
goaccess -d -f access.$date.log -a -p /etc/goaccess.conf >`date -d '-1 days' '+%m-%d'`.html    #日志的分析命令
awk -v val="$TODAY" ' $4 ~ val  {print $7}' access.$date.log  | awk '{split($1,res,"?") ; print res[1] }' | awk ' {a[$1]++} END {for (i in a) printf "%s %s \n", a[i] , i} ' | sort -nr > `date -d '-1 days' '+%m-%d'`.txt     #日志中所有接口访问量
	
`分析一天日志中每个小时中的接口访问量`
for j in {0..9}
do
grep "$day/$month/$year:0[$j-$j]" access.$date.log | awk -v val="$TODAY" ' $4 ~ val  {print $7}'  | awk '{split($1,res,"?") ; print res[1] }' | awk ' {a[$1]++} END {for (i in a) printf "%s %s \n", a[i] , i} ' | sort -nr > /$LJ/`date -d '-1 days' '+%m-%d'`-$j.txt
done


for k in {0..9}
do
	grep "$day/$month/$year:1[$k-$k]" access.$date.log | awk -v val="$TODAY" ' $4 ~ val  {print $7}'  | awk '{split($1,res,"?") ; print res[1] }' | awk ' {a[$1]++} END {for (i in a) printf "%s %s \n", a[i] , i} ' | sort -nr > /$LJ/`date -d '-1 days' '+%m-%d'`-1$k.txt
done


for l in {0..3}
do
grep "$day/$month/$year:2[$l-$l]" access.$date.log | awk -v val="$TODAY" ' $4 ~ val  {print $7}'  | awk '{split($1,res,"?") ; print res[1] }' | awk ' {a[$1]++} END {for (i in a) printf "%s %s \n", a[i] , i} ' | sort -nr > /$LJ/`date -d '-1 days' '+%m-%d'`-2$l.txt
done