scripts/old/ctc/logs.sh
2023-06-05 23:04:30 +08:00

1570 lines
58 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
function showfunc() {
# 支持的功能项
opt00="|00. Status Code"
opt01="|01. Respond Time"
opt02="|02. First Dur"
opt03="|03. Error Code"
opt04="|04. Remote IP"
opt05="|05. Client IP"
opt06="|06. Method"
opt07="|07. Protocol"
opt08="|08. TOP URL"
opt09="|09. Upstream Addr"
opt10="|10. Upstream RT"
opt11="|11. Origin IP"
opt12="|12. Combo"
opt13="|13. Referer"
opt14="|14. UA"
opt15="|15. Log"
opt16="|16. QPS"
opt17="|17. -"
opt18="|18. -"
opt19="|19. -"
opt20="|20 -"
opt21="|21 -"
opt22="|22 -"
opt23="|23 -"
opt24="|24 -"
opt25="|25 -"
opt26="|26 -"
opt27="|27 -"
opt28="|28. First Dur"
opt29="|29. Combo"
opt30="|30. Client(NG) IP"
opt31="|31. Origin IP"
opt32="|32. Source SC"
opt33="|33. Status Code"
opt34="|34. Origin URL"
opt35="|35. QPS"
opt36="|36. Log"
opt37="|37. Source CT"
opt38="|38. Source RT"
opt39="|39. -"
opt40="|40. -"
opt41="|41. -"
optA="ACCESS --> "
optO="ORIGIN --> "
fmt="${c_bib}%-10s${c_e}%-17s%-18s%-19s%-17s%-15s%-17s%-19s\n"
printf $fmt "$optA" "$opt00" "$opt01" "$opt02" "$opt03" "$opt04" "$opt05" "$opt06"
printf $fmt "$optA" "$opt07" "$opt08" "$opt09" "$opt10" "$opt11" "$opt12" "$opt13"
printf $fmt "$optA" "$opt14" "$opt15" "$opt16" "$opt17" "$opt18" "$opt19" "$opt20"
echo '------------------------------------------------------------------------------------------------------------------------------------'
printf $fmt "$optO" "$opt28" "$opt29" "$opt30" "$opt31" "$opt32" "$opt33" "$opt34"
printf $fmt "$optO" "$opt35" "$opt36" "$opt37" "$opt38" "$opt39" "$opt40" "$opt41"
}
function usage() {
echo -e "${c_bg}本工具实现指定域名&节点的${c_bc}一小时粒度${c_bg}日志搜索相关功能:${c_e}\n"
showfunc && echo
echo -e "${c_by}调用方法 -- logs domain node/IP [0|1]${c_e}"
echo -e "${c_by} param 1 - 要查询的域名${c_e}"
echo -e "${c_by} param 2 - 必须是边缘/父/中心的节点中英文名称或者IP${c_e}"
echo -e "${c_by} param 3 - 可选存在域名在平台显示为重叠实际却在通用资源池的情况日志不会带accid或者反之可以使用1或0强制指定带或不带accid${c_e}"
# echo -e "${c_by}易混淆解释:${c_e}"
# echo -e "${c_by} Upstream Addr -- 后端代理服务器IP和端口${c_e}"
# echo -e "${c_by} Source SC ------ 源站返回的状态码${c_e}"
# echo -e "${c_by} Source CT ------ 与源站建立连接的时间${c_e}"
# echo -e "${c_by} Source RT ------ 源站的响应时间${c_e}"
# echo -e "${c_by} Remote IP ------ 过滤节点VIP访问次数查看负载是否均衡${c_e}"
# echo -e "${c_by} Origin IP ------ 对于ACCESS日志是回上层IP对于ORIGIN日志是回上层或回源IP${c_e}"
# echo -e "${c_by} Log ----------- 从每个RIP随机获取一条日志可指定状态码${c_e}"
# echo -e "${c_by} QPS ------------ 获取每个RIP节点指定时间内的访问次数而非真正QPS可自行手动计算${c_e}"
echo
echo -e "${c_br}对于输出百分比的部分除了状态码类以及时间类的功能其他选项都是过滤了TOP10所以可能会出现比例之和小于1的情况另外当前仅支持常规CDN以及L1-7格式的日志搜寻暂不支持直播/安全/quic等使用过程中遇到任何问题可以联系fanmf11@chinatelecom.cn反馈${c_e}"
exit 222
}
function logfile() {
if [[ -d $trash ]]; then
echo -e "${c_br}对于同一个用户,同一时间只能运行一个实例,请重新运行...${c_e}"
exit 245
else
mkdir -p $trash
cd $trash && cd ..
docs=`ls`
for doc in $docs; do
[[ -f $doc ]] && rm -rf $doc
done
folders=`ls -t`
while [[ `echo $folders | awk '{print NF}'` -gt 29 ]]; do
folder=`ls -t | tail -1`
rm -rf $folder
folders=`ls -t`
done
cd $trash && touch logs
fi
}
function onCtrlC () {
# while capture Ctrl+C, kill all background processes silently and exit
exec 3>&2 # 3 is now a copy of 2
exec 2> /dev/null # 2 now points to /dev/null
sleep 1 # sleep to wait for process to die
exec 2>&3 # restore stderr to saved
exec 3>&- # close saved version
echo
echo -e "${c_bir}Ctrl+C is captured, exiting...\n${c_e}"
exit 101
}
function initial() {
# --------------------------------------------------------------------------------
# 入参正确性检测
let numOP=$# # number of parameter
OP="prefix "$@ # do a prefix cause '-' char may damage echo command
domain=`echo $OP | awk '{print $2}'` # get first param domain
label=`echo $OP | awk '{print $3}'` # get second param nodename or ip
accsw=`echo $OP | awk '{print $4}'` # get thied param, forcely acc var, 1 -- acc=reqid, 0 -- acc='-'
[[ $numOP -ne 2 && $numOP -ne 3 ]] && usage || logfile
# --------------------------------------------------------------------------------
# 检查域名是否在平台注册
res=`cat $data/domain.list | grep -w "$domain"`
[[ $res == '' ]] && { echo -e "${c_br}该域名未在天翼平台配置,一个小时内新增的域名无法查询,退出...${c_e}"; exit 247; }
# --------------------------------------------------------------------------------
# 获取正确的label
ips $label > ips.log 2>&1
# 如果不是天翼IP否则重新回到工作目录$trash
[[ $? -ne 0 ]] && { cd $trash; cat ips.log; exit 114; } || cd $trash
# --------------------------------------------------------------------------------
# 检查是否是重叠域名,并获取正确的解析组
infos --map $domain $TS
[[ $? -eq 205 || $? -eq 231 ]] && exit 205
cd $trash
if [[ `cat map.log | wc -l` -eq 1 ]]; then
map=`cat map.log`
else
maps=`cat map.log | sort | uniq`
count=1 && > remap.log
for map in $maps; do
echo $count": "$map | tee -a remap.log
let count=count+1
done
echo -ne "${c_bg}存在分区域解析,需确定解析组名称(默认是1)${c_e}\n"
read -t 60 imap
[[ $? -ne 0 ]] && { echo -e "${c_br}60s内无任何输入退出...${c_e}\n"; exit 102; }
# do a check to see if isp is correct or not
[[ $imap == '' ]] && let imap=1
map=`cat remap.log | awk -F ':' -v imap=$imap '$1==imap {print $2}'`
[[ $map == '' ]] && { echo -e "${c_br}请输入正确的序号,退出...${c_e}"; exit 165; }
fi
getlastcover $map > map.log
cat map.log | grep -q 'can not find sys_id'
[[ $? -eq 0 ]] && { echo -e "${c_br}该解析组未在平台配置,退出..."; exit 163; }
accid=`cat info.log | awk -F ':' '$1==3 {print $2}'`
overlap=`cat $data/domain.list | grep $accid | grep $domain | awk -F ',' '{print $17}'`
[[ $overlap == '"是"' ]] && overlap=1 || overlap=0
# 因为有些域名系统显示是重叠域名实际日志并没有带accid因为用的通用资源池
if [[ $accsw != "" && $accsw -eq 0 ]]; then
ida='-'
elif [[ $accsw != "" && $accsw -eq 1 ]]; then
ida=$accid
elif [[ $overlap -eq 0 ]]; then
ida='-'
elif [[ $overlap -eq 1 ]]; then
ida=$accid
fi
# --------------------------------------------------------------------------------
# 检查是否是英文标签的格式是的话保持label原值否则做进一步操作
echo $label | grep -Eq "(ct|cu|cm|bgp|ctbgp|cmbgp|cubgp|as|eu|sa|na|cbn|cern)_[a-z]{2,3}_[a-z]{2,20}[0-9]{1,2}_(c|e|n)[0-9]{0,2}"
if [[ $? -eq 0 ]]; then
label=$label
else
# 获取所有相关英文标签
labels=`cat ips.log | grep -Eo "(ct|cu|cm|bgp|ctbgp|cmbgp|cubgp|as|eu|sa|na|cbn|cern)_[a-z]{2,3}_[a-z]{2,20}[0-9]{1,2}_(c|e|n)[0-9]{0,2}" | sort | uniq`
[[ $labels == "" ]] && { echo -e "${c_bir}请输入正确的边缘/父层/中心节点的IP或者中英文节点名称退出...${c_e}"; exit 232; }
# 如果有多个匹配,则让用户确认是哪个
if [[ `echo $labels | awk '{print NF}'` -gt 1 ]]; then
for item in $labels; do
cat map.log | grep -wq $item
[[ $? -eq 0 ]] && echo -e "${c_biy} - $item${c_e}" || echo " - $item"
done
echo -e "${c_bp}输入的 ${c_by}$label${c_bp} 边缘节点中有两个组,请确认具体是哪个:${c_e}"
read -t 60 label_input
# 判断60s内无输入则自动退出
[[ $? -ne 0 ]] && { echo -e "${c_br}60s内无任何输入退出...\n${c_e}"; exit 116; }
# 判断输入信息是否是正确的
echo $labels | grep -wq $label_input
[[ $? -ne 0 ]] && { echo -e "${c_br}需要从如上选择正确的边缘节点信息,请重新运行,退出...\n${c_e}"; exit 117; }
label=$label_input
# 否则获取label
else
label=$labels
fi
fi
cat map.log | grep -wq $label
if [[ $? -ne 0 ]]; then
echo -e "${c_by}${label}${c_bc}不在$domain的解析组内,判断是否是父层节点(y/N)${c_e}"
read -t 60 isc
# 判断60s内无输入则自动退出
[[ $? -ne 0 ]] && { echo -e "${c_br}60s内无任何输入退出...\n${c_e}"; exit 116; }
# 判断输入信息是否是正确的
[[ $isc == 'n' || $isc == 'N' || $isc == 'no' || $isc == 'No' || $isc == 'NO' ]] && exit 234
fi
# --------------------------------------------------------------------------------
# 获取rip_list
ips $label > ips.log 2>&1 && cd $trash
rip_list=`cat ips.log | sed -n '/RIP/, /VIP/p' | grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort | uniq`
# 60s时间接收输入要查询的时间
echo -e "${c_bg}请输入要查询的reqID生成时间格式为yyyymmddHH(默认当前 - $(date +%Y%m%d%H)): ${c_e} "
read -t 60 time_range
[[ $? -ne 0 ]] && { echo -e "${c_br}60s内无任何输入退出...\n${c_e}"; exit 105; }
time_check
type_inp
}
#=======================================================================================
# 功能:获取查询指标
# 入参None
# 出参itype
function type_inp() {
# 60s时间接收输入要查询的类型
showfunc
echo -e "${c_bg}请输入要查询的指标(默认00) ${c_e}"
read -t 60 itype
[[ $? -ne 0 ]] && { echo -e "${c_br}60s内无任何输入退出...\n${c_e}"; exit 122; }
[[ $itype == '' ]] && itype='00'
# 60s时间接收输入要查询的类型
echo -e "1. 静态/下载/点播/全站(default - v03/ov06)"
echo -e "2. 直播(ACC1/2/3)"
echo -e "3. 安全"
echo -e "4. quic"
echo -e "5. L1/L2/L3/L4/L5/L6/L7(e.g. 查询L3则输入5.3)"
echo -e "${c_bg}请输入要查询的业务类型(默认1目前仅支持1/5) ${c_e}"
read -t 60 ptype
[[ $? -ne 0 ]] && { echo -e "${c_br}60s内无任何输入退出...\n${c_e}"; exit 122; }
[[ $ptype == '' ]] && ptype='1'
# 根据业务类型,指定前缀
[[ $ptype == '1' ]] && prefix=''
[[ $ptype == '5.1' ]] && prefix='L1_'
[[ $ptype == '5.2' ]] && prefix='L2_'
[[ $ptype == '5.3' ]] && prefix='L3_'
[[ $ptype == '5.4' ]] && prefix='L4_'
[[ $ptype == '5.5' ]] && prefix='L5_'
[[ $ptype == '5.6' ]] && prefix='L6_'
[[ $ptype == '5.7' ]] && prefix='L7_'
}
#=======================================================================================
# 功能检查输入的时间范围是否符合格式要求14天内不能是未来时间10位数字
# 入参time_range
# 出参current, year, month, day, hour, time_range
function time_check() {
# 如果入参 time_range 的值是空,或者说函数没有入参
if [[ $time_range == '' ]]; then
time_range=`date +%Y%m%d%H`
year=${time_range:0:4}
month=${time_range:4:2}
day=${time_range:6:2}
hour=${time_range:8:2}
current='yes'
return 0
fi
# 检查入参是否正确:长度,表示的时间范围等
[[ ! $time_range =~ ^[0-9]{10}$ ]] && { echo -e "${c_br}请输入正确的时间格式,退出...\n${c_e}"; exit 106; }
# 验证入参是10天以内的时间范围
now=`date +%s`
# 准备工作,后续要用
year=${time_range:0:4}
month=${time_range:4:2}
day=${time_range:6:2}
hour=${time_range:8:2}
# 将入参转换为秒
previous=`date -d "$year-$month-$day $hour:00:00" +"%s"`
# 计算当前时间 - 入参时间
let range_s=now-previous
let range_d=range_s/86400
# 如果是14天以外的入参时间则不可查
[[ $range_d -gt 10 ]] && { echo -e "${c_br}只能查找最近10天以内的日志记录退出...\n${c_e}"; exit 107; }
# 判断 time_range 是否是当前时间,并用 current 来标识,默认是当前,即 current = yes
[[ $time_range == `date +%Y%m%d%H` ]] && current='yes' || current='no'
}
function is_sc_specified() {
# 是否指定状态码
echo -e "${c_bb}直接回车默认过滤所有状态码,是否需要指定(000~999)${c_e}"
read -t 60 sc
# 判断60s内无输入则自动退出
[[ $? -ne 0 ]] && { echo -e "${c_br}60s内无任何输入退出...\n${c_e}"; exit 116; }
# 判断输入信息是否是正确的,当输入的状态码是空,则不做过滤,全部输出
if [[ $sc != "" ]]; then
echo $sc | grep -Eq "[0-9]{1,3}"
[[ $? -ne 0 ]] && { echo -e "${c_br}需要指定正确的状态码值,退出...\n${c_e}"; exit 117; }
fi
}
function cdn_access_common() {
field=$1
is_sc_specified
# 如果time_range是当前时间
exec 3>&2 && exec 2> /dev/null
if [[ $current == 'yes' ]]; then
# ssh 进每一个rip搜索core_access.log设定ssh连接超时时长为CT
# 把搜索的结果放进access_$rip文件所有的ssh命令都后台执行
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_access_log/${prefix}core_access.log | grep $domain;
cat $cdn_access_log/${prefix}core_access.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=1 -v code="$sc" -v acc="$ida" -v pos="$field" -f $toolbox/logcommon.awk | sort -nk2 | \
sort -nk2 | tail > access_${rip} &
done
# 如果time_range不是当前时间
else
# 简单粗暴地,分别过滤回滚文件和未归档两部分日志文件
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_access_log/${prefix}core_access.log_*${time_range}* | grep $domain;
zcat $cdn_access_log/$year$month$day/${prefix}core_access.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=1 -v code="$sc" -v acc="$ida" -v pos="$field" -f $toolbox/logcommon.awk | sort -nk2 | \
sort -nk2 | tail > access_${rip} &
done
fi
exec 2>&3 && exec 3>&- && wait
for rip in $rip_list; do
echo -e "=============== ${c_biy}$label: ${c_bic}$rip${c_e} ==============="
cat access_$rip && echo
done
}
function cdn_access_time() {
field=$1
is_sc_specified
# 如果time_range是当前时间
exec 3>&2 && exec 2> /dev/null
if [[ $current == 'yes' ]]; then
# ssh 进每一个rip搜索core_access.log设定ssh连接超时时长为CT
# 把搜索的结果放进access_$rip文件所有的ssh命令都后台执行
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_access_log/${prefix}core_access.log | grep $domain;
cat $cdn_access_log/${prefix}core_access.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=1 -v code="$sc" -v acc="$ida" -v pos="$field" -f $toolbox/logtime.awk | \
sort -nk3 > access_${rip} &
done
# 如果time_range不是当前时间
else
# 简单粗暴地,分别过滤回滚文件和未归档两部分日志文件
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_access_log/${prefix}core_access.log_*${time_range}* | grep $domain;
zcat $cdn_access_log/$year$month$day/${prefix}core_access.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=1 -v code="$sc" -v acc="$ida" -v pos="$field" -f $toolbox/logtime.awk | \
sort -nk3 > access_${rip} &
done
fi
exec 2>&3 && exec 3>&- && wait
for rip in $rip_list; do
echo -e "=============== ${c_biy}$label: ${c_bic}$rip${c_e} ==============="
cat access_$rip && echo
done
}
function cdn_access_sc() {
# 如果time_range是当前时间
exec 3>&2 && exec 2> /dev/null
if [[ $current == 'yes' ]]; then
# ssh 进每一个rip搜索core_access.log设定ssh连接超时时长为CT
# 把搜索的结果放进access_$rip文件所有的ssh命令都后台执行
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_access_log/${prefix}core_access.log | grep $domain;
cat $cdn_access_log/${prefix}core_access.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=1 -v acc="$ida" -v pos=4 -f $toolbox/logsc.awk | \
sort -nk1 | column -t > access_${rip} &
done
# 如果time_range不是当前时间
else
# 简单粗暴地,分别过滤回滚文件和未归档两部分日志文件
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_access_log/${prefix}core_access.log_*${time_range}* | grep $domain;
zcat $cdn_access_log/$year$month$day/${prefix}core_access.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=1 -v acc="$ida" -v pos=4 -f $toolbox/logsc.awk | \
sort -nk1 | column -t > access_${rip} &
done
fi
exec 2>&3 && exec 3>&- && wait
for rip in $rip_list; do
echo -e "=============== ${c_biy}$label: ${c_bic}$rip${c_e} ==============="
cat access_$rip && echo
done
}
function cdn_access_qps() {
is_sc_specified
# 如果time_range是当前时间
exec 3>&2 && exec 2> /dev/null
if [[ $current == 'yes' ]]; then
# ssh 进每一个rip搜索core_access.log设定ssh连接超时时长为CT
# 把搜索的结果放进access_$rip文件所有的ssh命令都后台执行
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_access_log/${prefix}core_access.log | grep $domain;
cat $cdn_access_log/${prefix}core_access.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=1 -v code="$sc" -v acc="$ida" -f $toolbox/logqps.awk | \
sort -nk1 | column -t > access_${rip} &
done
# 如果time_range不是当前时间
else
# 简单粗暴地,分别过滤回滚文件和未归档两部分日志文件
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_access_log/${prefix}core_access.log_*${time_range}* | grep $domain;
zcat $cdn_access_log/$year$month$day/${prefix}core_access.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=1 -v code="$sc" -v acc="$ida" -f $toolbox/logqps.awk | \
sort -nk1 | column -t > access_${rip} &
done
fi
exec 2>&3 && exec 3>&- && wait
for rip in $rip_list; do
echo -e "=============== ${c_biy}$label: ${c_bic}$rip${c_e} ==============="
cat access_$rip && echo
done
}
function is_access_condtion_specified() {
# 是否指定过滤条件
echo -e "${c_bb}根据如上对应组件的过滤功能,可查询符合特定组合条件的日志占比,格式如下${c_e}"
echo -e "${c_big}00: 404"
echo -e "02: 0-1"
echo -e "03: 2"
echo -e "04: 59.56.177.149"
echo -e "06: Post"
echo -e "08: https://www.ctyun.cn"
echo -e "14: Chrome/54.0 (Windows NT 10.0)${c_e}"
echo -e "${c_bic}Ctrl + D${c_e}"
echo -e "${c_by}每行对应一个条件Ctrl + D结束输入${c_e}"
cat > combo.log
echo "" >> combo.log
echo -e "${c_bb}\n正在处理中...${c_e}"
f00=""; f01=""; f02=""; f03=""; f04=""; f05=""; f06=""; f07=""; f08=""; f09=""; f10=""; f11=""; f13="";
f14=""; f01s=""; f02s=""; f10s=""; f01e=""; f02e=""; f10e=""
while read line; do
[[ $line == "" ]] && continue
index=`echo $line | awk -F ':' '{print $1}'`
filter=${line:3}
[[ "$index" == '00' ]] && { f00=$filter; continue; }
[[ "$index" == '01' ]] && { f01=$filter; continue; }
[[ "$index" == '02' ]] && { f02=$filter; continue; }
[[ "$index" == '03' ]] && { f03=$filter; continue; }
[[ "$index" == '04' ]] && { f04=$filter; continue; }
[[ "$index" == '05' ]] && { f05=$filter; continue; }
[[ "$index" == '06' ]] && { f06=$filter; continue; }
[[ "$index" == '07' ]] && { f07=$filter; continue; }
[[ "$index" == '08' ]] && { f08=$filter; continue; }
[[ "$index" == '09' ]] && { f09=$filter; continue; }
[[ "$index" == '10' ]] && { f10=$filter; continue; }
[[ "$index" == '11' ]] && { f11=$filter; continue; }
[[ "$index" == '13' ]] && { f13=$filter; continue; }
[[ "$index" == '14' ]] && { f14=$filter; continue; }
echo -e "${c_bir}[Ignored]${c_e} -- $line"
done < combo.log
# 处理时间类参数,只允许区间参数
[[ $f01 != "" ]] && { f01s=`echo $f01 | awk -F '-' '{print $1}'`; f01e=`echo $f01 | awk -F '-' '{print $2}'`; }
[[ $f02 != "" ]] && { f02s=`echo $f02 | awk -F '-' '{print $1}'`; f02e=`echo $f02 | awk -F '-' '{print $2}'`; }
[[ $f10 != "" ]] && { f10s=`echo $f10 | awk -F '-' '{print $1}'`; f10e=`echo $f10 | awk -F '-' '{print $2}'`; }
echo
}
function cdn_access_combo() {
is_access_condtion_specified
# 如果time_range是当前时间
exec 3>&2 && exec 2> /dev/null
if [[ $current == 'yes' ]]; then
# ssh 进每一个rip搜索core_access.log设定ssh连接超时时长为CT
# 把搜索的结果放进access_$rip文件所有的ssh命令都后台执行
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_access_log/${prefix}core_access.log | grep $domain;
cat $cdn_access_log/${prefix}core_access.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=1 -v acc="$ida" -v f00="$f00" -v f01="$f01" -v f02="$f02" -v f03="$f03" \
-v f04="$f04" -v f05="$f05" -v f06="$f06" -v f07="$f07" -v f08="$f08" -v f09="$f09" -v f10="$f10" -v f11="$f11" \
-v f13="$f13" -v f14="$f14" -v f01s="$f01s" -v f01e="$f01e" -v f02s="$f02s" -v f02e="$f02e" -v f10s="$f10s" \
-v f10e="$f10e" -v atype="combo" -f $toolbox/logcombo.awk | \
sort -nk1 | column -t > access_${rip} &
done
# 如果time_range不是当前时间
else
# 简单粗暴地,分别过滤回滚文件和未归档两部分日志文件
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_access_log/${prefix}core_access.log_*${time_range}* | grep $domain;
zcat $cdn_access_log/$year$month$day/${prefix}core_access.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=1 -v acc="$ida" -v f00="$f00" -v f01="$f01" -v f02="$f02" -v f03="$f03" \
-v f04="$f04" -v f05="$f05" -v f06="$f06" -v f07="$f07" -v f08="$f08" -v f09="$f09" -v f10="$f10" -v f11="$f11" \
-v f13="$f13" -v f14="$f14" -v f01s="$f01s" -v f01e="$f01e" -v f02s="$f02s" -v f02e="$f02e" -v f10s="$f10s" \
-v f10e="$f10e" -v atype="combo" -f $toolbox/logcombo.awk | \
sort -nk1 | column -t > access_${rip} &
done
fi
exec 2>&3 && exec 3>&- && wait
for rip in $rip_list; do
echo -e "=============== ${c_biy}$label: ${c_bic}$rip${c_e} ==============="
cat access_$rip && echo
done
}
function cdn_access_logs() {
is_access_condtion_specified
# 如果time_range是当前时间
exec 3>&2 && exec 2> /dev/null
if [[ $current == 'yes' ]]; then
# ssh 进每一个rip搜索core_access.log设定ssh连接超时时长为CT
# 把搜索的结果放进access_$rip文件所有的ssh命令都后台执行
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_access_log/${prefix}core_access.log | grep $domain;
cat $cdn_access_log/${prefix}core_access.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=1 -v acc="$ida" -v f00="$f00" -v f01="$f01" -v f02="$f02" -v f03="$f03" \
-v f04="$f04" -v f05="$f05" -v f06="$f06" -v f07="$f07" -v f08="$f08" -v f09="$f09" -v f10="$f10" -v f11="$f11" \
-v f13="$f13" -v f14="$f14" -v f01s="$f01s" -v f01e="$f01e" -v f02s="$f02s" -v f02e="$f02e" -v f10s="$f10s" \
-v f10e="$f10e" -v atype="logs" -f $toolbox/logcombo.awk | \
grep -Ev "$hour:(59|00):[0-5][0-9] \+0800" | head -n $((number % 1000)) | tail -n 1 > access_${rip} &
done
# 如果time_range不是当前时间
else
# 简单粗暴地,分别过滤回滚文件和未归档两部分日志文件
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_access_log/${prefix}core_access.log_*${time_range}* | grep $domain;
zcat $cdn_access_log/$year$month$day/${prefix}core_access.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=1 -v acc="$ida" -v f00="$f00" -v f01="$f01" -v f02="$f02" -v f03="$f03" \
-v f04="$f04" -v f05="$f05" -v f06="$f06" -v f07="$f07" -v f08="$f08" -v f09="$f09" -v f10="$f10" -v f11="$f11" \
-v f13="$f13" -v f14="$f14" -v f01s="$f01s" -v f01e="$f01e" -v f02s="$f02s" -v f02e="$f02e" -v f10s="$f10s" \
-v f10e="$f10e" -v atype="logs" -f $toolbox/logcombo.awk | \
grep -Ev "$hour:(59|00):[0-5][0-9] \+0800" | head -n $((number % 1000)) | tail -n 1 > access_${rip} &
done
fi
exec 2>&3 && exec 3>&- && wait
for rip in $rip_list; do
echo -e "=============== ${c_biy}$label: ${c_bic}$rip${c_e} ==============="
cat access_$rip && echo
done
}
function cdn_origin_common() {
field=$1
is_sc_specified
# 如果time_range是当前时间
exec 3>&2 && exec 2> /dev/null
if [[ $current == 'yes' ]]; then
# ssh 进每一个rip搜索origin.log设定ssh连接超时时长为CT
# 把搜索的结果放进origin_$rip文件所有的ssh命令都后台执行
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_origin_log/origin.log | grep $domain;
cat $cdn_origin_log/origin.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=0 -v code="$sc" -v acc="$ida" -v pos="$field" -f $toolbox/logcommon.awk | \
sort -nk2 | tail > origin_${rip} &
done
# 如果time_range不是当前时间
else
# 简单粗暴地,分别过滤回滚文件和未归档两部分日志文件
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_origin_log/origin.log_*${time_range}* | grep $domain;
zcat $cdn_origin_log/$year$month$day/origin.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=0 -v code="$sc" -v acc="$ida" -v pos="$field" -f $toolbox/logcommon.awk | \
sort -nk2 | tail > origin_${rip} &
done
fi
exec 2>&3 && exec 3>&- && wait
for rip in $rip_list; do
echo -e "=============== ${c_biy}$label: ${c_bic}$rip${c_e} ==============="
cat origin_$rip && echo
done
}
function cdn_origin_time() {
field=$1
is_sc_specified
# 如果time_range是当前时间
exec 3>&2 && exec 2> /dev/null
if [[ $current == 'yes' ]]; then
# ssh进每一个rip搜索origin.log设定ssh连接超时时长为CT
# 把搜索的结果放进origin_$rip文件所有的ssh命令都后台执行
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_origin_log/origin.log | grep $domain;
cat $cdn_origin_log/origin.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=0 -v code="$sc" -v acc="$ida" -v pos="$field" -f $toolbox/logtime.awk | \
sort -nk3 > origin_${rip} &
done
# 如果time_range不是当前时间
else
# 简单粗暴地,分别过滤回滚文件和未归档两部分日志文件
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_origin_log/origin.log_*${time_range}* | grep $domain;
zcat $cdn_origin_log/$year$month$day/origin.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=0 -v code="$sc" -v acc="$ida" -v pos="$field" -f $toolbox/logtime.awk | \
sort -nk3 > origin_${rip} &
done
fi
exec 2>&3 && exec 3>&- && wait
for rip in $rip_list; do
echo -e "=============== ${c_biy}$label: ${c_bic}$rip${c_e} ==============="
cat origin_$rip && echo
done
}
function cdn_origin_sc() {
[[ $1 == 'sc' ]] && field=11
[[ $1 == 'ssc' ]] && field=10
# 如果time_range是当前时间
exec 3>&2 && exec 2> /dev/null
if [[ $current == 'yes' ]]; then
# ssh 进每一个rip搜索origin.log设定ssh连接超时时长为CT
# 把搜索的结果放进origin_$rip文件所有的ssh命令都后台执行
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_origin_log/origin.log | grep $domain;
cat $cdn_origin_log/origin.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=0 -v acc="$ida" -v pos="$field" -f $toolbox/logsc.awk | \
sort -nk1 | column -t > origin_${rip} &
done
# 如果time_range不是当前时间
else
# 简单粗暴地,分别过滤回滚文件和未归档两部分日志文件
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_origin_log/origin.log_*${time_range}* | grep $domain;
zcat $cdn_origin_log/$year$month$day/origin.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=0 -v acc="$ida" -v pos="$field" -f $toolbox/logsc.awk | \
sort -nk1 | column -t > origin_${rip} &
done
fi
exec 2>&3 && exec 3>&- && wait
for rip in $rip_list; do
echo -e "=============== ${c_biy}$label: ${c_bic}$rip${c_e} ==============="
cat origin_$rip && echo
done
}
function cdn_origin_qps() {
is_sc_specified
# 如果time_range是当前时间
exec 3>&2 && exec 2> /dev/null
if [[ $current == 'yes' ]]; then
# ssh 进每一个rip搜索origin.log设定ssh连接超时时长为CT
# 把搜索的结果放进origin_$rip文件所有的ssh命令都后台执行
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_origin_log/origin.log | grep $domain;
cat $cdn_origin_log/origin.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=0 -v code="$sc" -v acc="$ida" -f $toolbox/logqps.awk | \
sort -nk1 | column -t > origin_${rip} &
done
# 如果time_range不是当前时间
else
# 简单粗暴地,分别过滤回滚文件和未归档两部分日志文件
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_origin_log/origin.log_*${time_range}* | grep $domain;
zcat $cdn_origin_log/$year$month$day/origin.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=0 -v code="$sc" -v acc="$ida" -f $toolbox/logqps.awk | \
sort -nk1 | column -t > origin_${rip} &
done
fi
exec 2>&3 && exec 3>&- && wait
for rip in $rip_list; do
echo -e "=============== ${c_biy}$label: ${c_bic}$rip${c_e} ==============="
cat origin_$rip && echo
done
}
function is_origin_condtion_specified() {
# 是否指定过滤条件
echo -e "${c_bb}根据如上对应组件的过滤功能,可查询符合特定组合条件的日志占比,格式如下${c_e}"
echo -e "${c_big}28: 0-1"
echo -e "31: 59.56.177.149"
echo -e "33: 404"
echo -e "34: https://www.ctyun.cn"
echo -e "${c_bic}Ctrl + D${c_e}"
echo -e "${c_by}每行对应一个条件Ctrl + D结束输入${c_e}"
cat > combo.log
echo "" >> combo.log
echo -e "${c_bb}\n正在处理中...${c_e}"
f28=""; f30=""; f31=""; f32=""; f33=""; f34=""; f37=""; f38=""; f28s=""; f28e=""; f37s=""; f37e=""; f38s=""; f38e=""
while read line; do
[[ $line == "" ]] && continue
index=`echo $line | awk -F ':' '{print $1}'`
filter=${line:3}
[[ "$index" == '28' ]] && { f28=$filter; continue; }
[[ "$index" == '30' ]] && { f30=$filter; continue; }
[[ "$index" == '31' ]] && { f31=$filter; continue; }
[[ "$index" == '32' ]] && { f32=$filter; continue; }
[[ "$index" == '33' ]] && { f33=$filter; continue; }
[[ "$index" == '34' ]] && { f34=$filter; continue; }
[[ "$index" == '37' ]] && { f37=$filter; continue; }
[[ "$index" == '38' ]] && { f38=$filter; continue; }
echo -e "${c_bir}[Ignored]${c_e} -- $line"
done < combo.log
# 处理时间类参数,只允许区间参数
[[ $f28 != "" ]] && { f28s=`echo $f28 | awk -F '-' '{print $1}'`; f28e=`echo $f28 | awk -F '-' '{print $2}'`; }
[[ $f37 != "" ]] && { f37s=`echo $f37 | awk -F '-' '{print $1}'`; f37e=`echo $f37 | awk -F '-' '{print $2}'`; }
[[ $f38 != "" ]] && { f38s=`echo $f38 | awk -F '-' '{print $1}'`; f38e=`echo $f38 | awk -F '-' '{print $2}'`; }
echo
}
function cdn_origin_combo() {
is_origin_condtion_specified
# 如果time_range是当前时间
exec 3>&2 && exec 2> /dev/null
if [[ $current == 'yes' ]]; then
# ssh 进每一个rip搜索origin.log设定ssh连接超时时长为CT
# 把搜索的结果放进origin_$rip文件所有的ssh命令都后台执行
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_origin_log/origin.log | grep $domain;
cat $cdn_origin_log/origin.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=0 -v acc="$ida" -v f28="$f28" -v f30="$f30" -v f31="$f31" -v f32="$f32" \
-v f33="$f33" -v f34="$f34" -v f37="$f37" -v f38="$f38" -v f28s="$f28s" -v f28e="$f28e" -v f37s="$f37s" \
-v f37e="$f37e" -v f38s="$f38s" -v f38e="$f38e" -v atype="combo" -f $toolbox/logcombo.awk | \
sort -nk1 | column -t > origin_${rip} &
done
# 如果time_range不是当前时间
else
# 简单粗暴地,分别过滤回滚文件和未归档两部分日志文件
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_origin_log/origin.log_*${time_range}* | grep $domain;
zcat $cdn_origin_log/$year$month$day/origin.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=0 -v acc="$ida" -v f28="$f28" -v f30="$f30" -v f31="$f31" -v f32="$f32" \
-v f33="$f33" -v f34="$f34" -v f37="$f37" -v f38="$f38" -v f28s="$f28s" -v f28e="$f28e" -v f37s="$f37s" \
-v f37e="$f37e" -v f38s="$f38s" -v f38e="$f38e" -v atype="combo" -f $toolbox/logcombo.awk | \
sort -nk1 | column -t > origin_${rip} &
done
fi
exec 2>&3 && exec 3>&- && wait
for rip in $rip_list; do
echo -e "=============== ${c_biy}$label: ${c_bic}$rip${c_e} ==============="
cat origin_$rip && echo
done
}
function cdn_origin_logs() {
is_origin_condtion_specified
# 如果time_range是当前时间
exec 3>&2 && exec 2> /dev/null
if [[ $current == 'yes' ]]; then
# ssh 进每一个rip搜索origin.log设定ssh连接超时时长为CT
# 把搜索的结果放进origin_$rip文件所有的ssh命令都后台执行
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_origin_log/origin.log | grep $domain;
cat $cdn_origin_log/origin.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=0 -v acc="$ida" -v f28="$f28" -v f30="$f30" -v f31="$f31" -v f32="$f32" \
-v f33="$f33" -v f34="$f34" -v f37="$f37" -v f38="$f38" -v f28s="$f28s" -v f28e="$f28e" -v f37s="$f37s" \
-v f37e="$f37e" -v f38s="$f38s" -v f38e="$f38e" -v atype="logs" -f $toolbox/logcombo.awk | \
grep -Ev "$hour:(59|00):[0-5][0-9] \+0800" | head -n $((number % 1000)) | tail -n 1 > origin_${rip} &
done
# 如果time_range不是当前时间
else
# 简单粗暴地,分别过滤回滚文件和未归档两部分日志文件
for rip in $rip_list; do
ssh -o ConnectTimeout=$CT $rip "
cat $cdn_origin_log/origin.log_*${time_range}* | grep $domain;
zcat $cdn_origin_log/$year$month$day/origin.log_*${time_range}* | grep $domain" | grep $domain | \
awk -F '"' -v comp=0 -v acc="$ida" -v f28="$f28" -v f30="$f30" -v f31="$f31" -v f32="$f32" \
-v f33="$f33" -v f34="$f34" -v f37="$f37" -v f38="$f38" -v f28s="$f28s" -v f28e="$f28e" -v f37s="$f37s" \
-v f37e="$f37e" -v f38s="$f38s" -v f38e="$f38e" -v atype="logs" -f $toolbox/logcombo.awk | \
grep -Ev "$hour:(59|00):[0-5][0-9] \+0800" | head -n $((number % 1000)) | tail -n 1 > origin_${rip} &
done
fi
exec 2>&3 && exec 3>&- && wait
for rip in $rip_list; do
echo -e "=============== ${c_biy}$label: ${c_bic}$rip${c_e} ==============="
cat origin_$rip && echo
done
}
# ============================================================================================================
# Part 00: Status Code
function statusCodeA() {
if [[ $ptype == '1' ]]; then
statusCodeA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
statusCodeA1
else
:
fi
}
function statusCodeA1() {
cdn_access_sc
}
# ============================================================================================================
# Part 01: Respond Time
function respondTimeA() {
if [[ $ptype == '1' ]]; then
respondTimeA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
respondTimeA1
else
:
fi
}
function respondTimeA1() {
cdn_access_time "6"
}
# ============================================================================================================
# Part 02: First Dur
function firstDurA() {
if [[ $ptype == '1' ]]; then
firstDurA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
firstDurA1
else
:
fi
}
function firstDurA1() {
cdn_access_time "9"
}
# ============================================================================================================
# Part 03: Error Code
function errorCodeA() {
if [[ $ptype == '1' ]]; then
errorCodeA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
errorCodeA1
else
:
fi
}
function errorCodeA1() {
cdn_access_common "10"
}
# ============================================================================================================
# Part 04: Remote IP
function remoteIPA() {
if [[ $ptype == '1' ]]; then
remoteIPA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
remoteIPA1
else
:
fi
}
function remoteIPA1() {
cdn_access_common "11"
}
# ============================================================================================================
# Part 05: Client IP
function clientIPA() {
if [[ $ptype == '1' ]]; then
clientIPA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
clientIPA1
else
:
fi
}
function clientIPA1() {
cdn_access_common "13"
}
# ============================================================================================================
# Part 06: Method
function methodA() {
if [[ $ptype == '1' ]]; then
methodA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
methodA1
else
:
fi
}
function methodA1() {
cdn_access_common "15"
}
# ============================================================================================================
# Part 07: Protocol
function protocolA() {
if [[ $ptype == '1' ]]; then
protocolA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
protocolA1
else
:
fi
}
function protocolA1() {
cdn_access_common "16"
}
# ============================================================================================================
# Part 08: Top URL
function topUrlA() {
if [[ $ptype == '1' ]]; then
topUrlA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
topUrlA1
else
:
fi
}
function topUrlA1() {
cdn_access_common "18"
}
# ============================================================================================================
# Part 09: Upstream Addr
function upstreamAddrA() {
if [[ $ptype == '1' ]]; then
upstreamAddrA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
upstreamAddrA1
else
:
fi
}
function upstreamAddrA1() {
cdn_access_common "24"
}
# ============================================================================================================
# Part 10: Upstream Respond Time
function upstreamRTimeA() {
if [[ $ptype == '1' ]]; then
upstreamRTimeA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
upstreamRTimeA1
else
:
fi
}
function upstreamRTimeA1() {
cdn_access_time "26"
}
# ============================================================================================================
# Part 11: Origin IP for NG
function originIPA() {
if [[ $ptype == '1' ]]; then
originIPA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
originIPA1
else
:
fi
}
function originIPA1() {
cdn_access_common "28"
}
# ============================================================================================================
# Part 12: Combo -- multi condition searching
function comboA() {
if [[ $ptype == '1' ]]; then
comboA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
comboA1
else
:
fi
}
function comboA1() {
cdn_access_combo
}
# ============================================================================================================
# Part 13: Referer
function refererA() {
if [[ $ptype == '1' ]]; then
refererA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
refererA1
else
:
fi
}
function refererA1() {
cdn_access_common "33"
}
# ============================================================================================================
# Part 14: UA
function uaA() {
if [[ $ptype == '1' ]]; then
uaA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
uaA1
else
:
fi
}
function uaA1() {
cdn_access_common "34"
}
# ============================================================================================================
# Part 15: Log
function logA() {
if [[ $ptype == '1' ]]; then
logA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
logA1
else
:
fi
}
function logA1() {
cdn_access_logs
}
# ============================================================================================================
# Part 16: QPS
function qpsA() {
if [[ $ptype == '1' ]]; then
qpsA1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
qpsA1
else
:
fi
}
function qpsA1() {
cdn_access_qps
}
# ============================================================================================================
# Part 28: Origin First Dur
function firstDurO() {
if [[ $ptype == '1' ]]; then
firstDurO1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
firstDurO1
else
:
fi
}
function firstDurO1() {
cdn_origin_time "5"
}
# ============================================================================================================
# Part 29: Combo -- multi condition searching
function comboO() {
if [[ $ptype == '1' ]]; then
comboO1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
comboO1
else
:
fi
}
function comboO1() {
cdn_origin_combo
}
# ============================================================================================================
# Part 30: Origin Client(NG) IP
function clientIPO() {
if [[ $ptype == '1' ]]; then
clientIPO1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
clientIPO1
else
:
fi
}
function clientIPO1() {
cdn_origin_common "7"
}
# ============================================================================================================
# Part 31: Origin IP
function originIPO() {
if [[ $ptype == '1' ]]; then
originIPO1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
originIPO1
else
:
fi
}
function originIPO1() {
cdn_origin_common "8"
}
# ============================================================================================================
# Part 32: Source Status Code
function sourceSCO() {
if [[ $ptype == '1' ]]; then
sourceSCO1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
sourceSCO1
else
:
fi
}
function sourceSCO1() {
cdn_origin_sc "ssc"
}
# ============================================================================================================
# Part 33: Origin Status Code
function statusCodeO() {
if [[ $ptype == '1' ]]; then
statusCodeO1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
statusCodeO1
else
:
fi
}
function statusCodeO1() {
cdn_origin_sc "sc"
}
# ============================================================================================================
# Part 34: Origin URL
function topUrlO() {
if [[ $ptype == '1' ]]; then
topUrlO1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
topUrlO1
else
:
fi
}
function topUrlO1() {
cdn_origin_common "46"
}
# ============================================================================================================
# Part 35: Origin QPS
function qpsO() {
if [[ $ptype == '1' ]]; then
qpsO1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
qpsO1
else
:
fi
}
function qpsO1() {
cdn_origin_qps
}
# ============================================================================================================
# Part 36: Origin Random Logs
function logO() {
if [[ $ptype == '1' ]]; then
logO1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
logO1
else
:
fi
}
function logO1() {
cdn_origin_logs
}
# ============================================================================================================
# Part 37: Source Connection Time
function sourceCTO() {
if [[ $ptype == '1' ]]; then
sourceCTO1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
sourceCTO1
else
:
fi
}
function sourceCTO1() {
cdn_origin_time "4"
}
# ============================================================================================================
# Part 38: Source Respond Time
function SourceRTO() {
if [[ $ptype == '1' ]]; then
sourceRTO1
elif [[ $ptype == '2' ]]; then
:
elif [[ $ptype == '3' ]]; then
:
elif [[ $ptype == '4' ]]; then
:
elif [[ $ptype == '5.1' || $ptype == '5.2' || $ptype == '5.3' || $ptype == '5.4' || $ptype == '5.5' || $ptype == '5.6' || $ptype == '5.7' ]]; then
sourceRTO1
else
:
fi
}
function sourceRTO1() {
cdn_origin_time "6"
}
# --------------------------------------------------------------------------------
# set a trap for Ctrl+C
trap 'onCtrlC' INT
# --------------------------------------------------------------------------------
# 自定义颜色显示
c_br='\e[1;31m' # bold red
c_bg='\e[1;32m' # bold green
c_by='\e[1;33m' # bold yellow
c_bb='\e[1;34m' # bold blue
c_bp='\e[1;35m' # bold purple
c_bc='\e[1;36m' # bold cyan
c_bir='\e[1;3;31m' # bold italic red
c_big='\e[1;3;32m' # bold italic green
c_biy='\e[1;3;33m' # bold italic yellow
c_bib='\e[1;3;34m' # bold italic blue
c_bip='\e[1;3;35m' # bold italic purple
c_bic='\e[1;3;36m' # bold italic cyan
c_e='\e[0m' # reset
# --------------------------------------------------------------------------------
# 初始化设定
number=`date +%N`
CT=45
stty erase '^H' # allow backspace
data='/usr/local/script/fanmf11/data' # set data directory path
toolbox='/usr/local/script/fanmf11' # set toobbox directory path
TS=`date +%s%N` # document the start time of the script
host=`whoami` # who use this script
trash="/usr/local/script/fanmf11/trash/$host/$TS" # set trash directory path
livelog='/home/log/cluster_live_log'
liveatslog='/home/log/trafficserver'
cdn_access_log='/home/log/cluster_gateway_log' # *
cdn_origin_log='/home/log/trafficserver' # *
# --------------------------------------------------------------------------------
# 初始化,获得必要的变量
initial $@
# --------------------------------------------------------------------------------
# 主程序分支
if [[ $itype == '00' ]]; then
statusCodeA
elif [[ $itype == '01' ]]; then
respondTimeA
elif [[ $itype == '02' ]]; then
firstDurA
elif [[ $itype == '03' ]]; then
errorCodeA
elif [[ $itype == '04' ]]; then
remoteIPA
elif [[ $itype == '05' ]]; then
clientIPA
elif [[ $itype == '06' ]]; then
methodA
elif [[ $itype == '07' ]]; then
protocolA
elif [[ $itype == '08' ]]; then
topUrlA
elif [[ $itype == '09' ]]; then
upstreamAddrA
elif [[ $itype == '10' ]]; then
upstreamRTimeA
elif [[ $itype == '11' ]]; then
originIPA
elif [[ $itype == '12' ]]; then
comboA
elif [[ $itype == '13' ]]; then
refererA
elif [[ $itype == '14' ]]; then
uaA
elif [[ $itype == '15' ]]; then
logA
elif [[ $itype == '16' ]]; then
qpsA
elif [[ $itype == '17' ]]; then
:
elif [[ $itype == '18' ]]; then
:
elif [[ $itype == '19' ]]; then
:
elif [[ $itype == '20' ]]; then
:
elif [[ $itype == '21' ]]; then
:
elif [[ $itype == '22' ]]; then
:
elif [[ $itype == '23' ]]; then
:
elif [[ $itype == '24' ]]; then
:
elif [[ $itype == '25' ]]; then
:
elif [[ $itype == '26' ]]; then
:
elif [[ $itype == '27' ]]; then
:
elif [[ $itype == '28' ]]; then
firstDurO
elif [[ $itype == '29' ]]; then
comboO
elif [[ $itype == '30' ]]; then
clientIPO
elif [[ $itype == '31' ]]; then
originIPO
elif [[ $itype == '32' ]]; then
sourceSCO
elif [[ $itype == '33' ]]; then
statusCodeO
elif [[ $itype == '34' ]]; then
topUrlO
elif [[ $itype == '35' ]]; then
qpsO
elif [[ $itype == '36' ]]; then
logO
elif [[ $itype == '37' ]]; then
sourceCTO
elif [[ $itype == '38' ]]; then
SourceRTO
elif [[ $itype == '39' ]]; then
:
elif [[ $itype == '40' ]]; then
:
elif [[ $itype == '41' ]]; then
:
else
:
fi