运维工作是一个比较复杂的工作,有时候面对上万条的日志,如何作分析?难道一条条的分析?
成都创新互联是一家集网站建设,永和企业网站建设,永和品牌网站建设,网站定制,永和网站建设报价,网络营销,网络优化,永和网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
聪明的人会选择脚本,这就是为什么现在提倡自动化运维的原因吧,废话不多说,直接上脚本。
vim /data/scripts/log_analysis.sh
#!/bin/bash
###############################################
# Desc :nginx日志分析脚本 #
# Author : Bertram #
# Date : 2019-12-21 #
# Copyright : Personal belongs #
###############################################
public(){
echo ""
read -p "请输入要分析的访问日志: " log_file
echo ""
if [ ! -f $log_file ];then
echo "未找到: ${log_file}"
exit 1
fi
if [ ! -s $log_file ];then
echo "${log_file}是空文件"
exit 1
fi
#输出日志访问量排名前top_num条数据,可自定义
top_num=5
input_file=`echo $log_file | awk -F '/' '{print $(NF)}'`
analyze_dir=/home/Bertram/`date +%F`
top_ip_file=$analyze_dir/ngx_log_top_ip_${input_file}.txt
top_src_url_file=$analyze_dir/ngx_log_top_src_url_${input_file}.txt
top_dest_url_file=$analyze_dir/ngx_log_top_dest_url_${input_file}.txt
top_code_file=$analyze_dir/ngx_log_top_code_${input_file}.txt
top_terminal_file=$analyze_dir/ngx_log_top_terminal_${input_file}.txt
mkdir -p $analyze_dir
start_time=`head -1 $log_file | awk '{print $4}'|cut -d "[" -f2`
end_time=`tail -1 $log_file | awk '{print $4}'|cut -d "[" -f2`
total_nums=`wc -l $log_file | awk '{print $1}'`
size=`du -sh $log_file | awk '{print $1}'`
#获取起始与截止时间
echo "访问起始时间: $start_time ; 截止时间: $end_time"
#获取总行数与大小
echo "共访问 $total_nums 次 ; 日志大小: $size"
#获取最活跃IP
##cat $log_file | awk '{print $1}' | sort | uniq -c | sort -rn | head -${top_num} > $top_ip_file
awk '{ips[$1]++} END{for (i in ips){print ips[i],i}}' $log_file | sort | uniq -c | sort -k1 -nr| head -${top_num} > $top_ip_file
#获取访问来源最多的url
cat $log_file | awk '{print $13}' | sort | uniq -c | sort -rn | head -${top_num} > $top_src_url_file
#获取请求最多的url
cat $log_file | awk '{print $8}' | sort | uniq -c | sort -rn | head -${top_num} > $top_dest_url_file
#获取返回最多的状态码
cat $log_file | awk '{print $11}'| sort | uniq -c | sort -rn | head -${top_num} > $top_code_file
#获取返回最多的终端类型
cat $log_file | awk '{print $14}'| sort | uniq -c | sort -rn | head -${top_num} > $top_terminal_file
}
simple(){
echo "+-+-+-+-+-+- 下面是分析内容 +-+-+-+-+-+-"
#获取最活跃IP
printf "最活跃的前${top_num}个访问IP: \n"
cat $top_ip_file
echo ""
#获取访问来源最多的url
printf "访问来源最多的前${top_num}个url: \n"
cat $top_src_url_file
echo ""
#获取请求最多的url
printf "请求最多的前${top_num}个url: \n"
cat $top_dest_url_file
echo ""
#获取返回最多的状态码
printf "返回最多的前${top_num}个状态码: \n"
cat $top_code_file
echo ""
printf ""
#获取返回最多的终端号
printf "返回最多的前${top_num}个终端号: \n"
cat $top_terminal_file
echo ""
printf ""
printf "返回最多的前${top_num}个IP所属城市(查询时间有点慢,耐心等待!): \n"
echo ''
printf "%-15s %-15s %-30s\n" "访问次数" " IP地址" " 归属地"
echo '-----------------------------------------------'
a=0
cat $analyze_dir/ngx_log_top_ip_${input_file}.txt | while read line
do
ip=$(echo $line | cut -d '"' -f2)
count=$(echo $line | cut -d '"' -f1)
printf "%-10s %-15s %-30s\n" $count $ip $(curl -s "http://freeapi.ipip.net/$(echo $line | cut -d '"' -f2)" | awk -F '\"' {'print $2"--"$4"--"$6'})
echo '-----------------------------------------------'
let a=a+1
done
echo ""
printf ""
}
case $1 in
help)
echo ""
echo -e $"Usage: $0 enter a log file \n"
;;
*)
public
simple
;;
esac
exit 0
实现功能:
1、分析访问排名前N的ip地址;
2、分析访问排名前N的url;
3、分析访问排名前N的目标url;
4、分析访问排名前N的终端类型;
5、自动匹配排名前N的ip的归属地。
注意:日志文件和分析脚本放在一个目录即可;日志文件输入绝对路径。用法: