Вывод записей лога Nginx за последние 15 минут
Занимаясь администрированием серверов, довольно часто сталкиваешься с необходимостью вывода данных из логов, за определенный период времени. В один прекрасный день и я столкнулся с задачей, вывода количества запросов по IP адресам, из лога Nginx за последние 15 минут. Порывшись в сети, я обнаружил что этот вопрос актуален для многих и написал совсем небольшой, но крайне полезный скрипт, который позволяет выводить IP адреса и подсчитывать количество запросов. При этом можно самостоятельно указать, нужный вам отрезок времени в минутах, к примеру: 10, 15, 30, 60 или любой другой.
Вот собственно и сам скрипт
#!/usr/bin/bash
#
# Считываем кол-во запросов по IP адресам из лога Nginx
# Без параметров количество запосов по IP, за последние 15 минут
# Опционально 1 параметром - время за которое выводим данные лога, в минутах
#
export LC_ALL=en_US.UTF-8
export LC_NUMERIC=C
if [ -z "$1" ]
then
MNT="15"
else
MNT="$1"
fi
# Максимальное количество IP в выводе
# По умолчанию 100
CNT="100"
TMS="$(date +%s)"
STR=""
STX=""
let "SEK = MNT * 60"
let "EXP = TMS - SEK"
while :
do
STR="$STR$STX$(date -d @$EXP +'%d/%h/%Y:%H:%M')"
let "EXP = EXP + 60"
STX="|"
if [ "$EXP" == "$TMS" ]
then
break
fi
done
echo "$(cat /var/log/nginx/access.log | grep -E $STR | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -n$CNT)"
Как вы видите, скрипт предельно прост и лаконичен. Скрипт можно вызвать без параметров, тогда он выведет данные лога Nginx за последние 15 минут или указав нужный отрезок времени первым параметром, к примеру 30 минут. В обоих случаях, мы получим приблизительно такой результат:
[root@server ~]# /usr/local/bin/log.sh 30
153 91.223.109.1
53 109.110.66.110
50 31.163.10.71
48 176.110.42.96
32 178.200.195.113
22 46.39.53.103
21 147.30.111.170
7 157.55.39.96
6 65.55.212.95
5 178.20.235.164
3 176.9.136.47
3 101.226.33.237
2 95.108.129.196
1 63.245.214.162
1 5.44.172.133