2018/07/04

sh 分析 Apache access log

最近開始學習 server 管理,嘗試學習各種跟 server 有關的工具跟 knowhow,有個網站的簡易 shell script 語法可以快速做一些事情,把他寫成一個小工具來使用

apache_logger.sh
#!/bin/bash

command=$1
log=$2
commands=(
ip
access
loading
long
flow
404
)
commands_description=(
'ip 取得前十名 access 最多的 IP 位址'
'access 取得前十名 access 最多的網頁'
'loading 取得前十名 Loading 最大的頁面'
'long 取得前十名 User access 最久的頁面'
'flow 取得 access log 平均流量 (GB)'
'404 取得所有 404 Link'
)

function show_commands() {
    printf "用法 - sh loger.sh 命令 log位置\n\n"
    for (( i = 0; i < ${#commands_description[@]}; i++ )); do
        echo ${commands_description[$i]}
    done
    exit
}

if [[ -z $command && -z $log ]]; then
    show_commands
fi

if [[ -z $command ]]; then
    echo "Please input command"
    exit
fi

if [[ -z $log ]]; then
    echo "Please input log path"
    exit
fi

if [[ ! -f $log ]]; then
    echo "Log file is not exist"
    exit
fi

in_command=false
for (( i = 0; i < ${#commands[@]}; i++ )); do
    if [[ $command == ${commands[$i]} ]]; then
        in_command=true
    fi
done

if [[ $in_command = false ]]; then
    printf "Invalid command\n\n"
    show_commands
fi

case $command in
    'ip')
        cat $log |awk '{print $1}'|sort|uniq -c|sort -nr|head -10
        ;;
    'access')
        cat $log |awk '{print $11}'|sort|uniq -c|sort -nr|head -10
        ;;
    'loading')
        cat $log |awk '($NF > 60 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -10
        ;;
    'long')
        cat $log |awk  '($7~/\.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -10
        ;;
    'flow')
        cat $log |awk '{sum+=$10} END {print sum/1024/1024/1024}'
        ;;
    '404')
        awk '($9 ~/404/)' $log | awk '{print $9,$7}' | sort
        ;;
esac

參考網站:快速分析 Apache 的 access log,抓出前十大網站流量兇手

沒有留言: