Студия веб дизайна, создание сайтов

Сопровождение и техническая поддержка сайтов

10 лет на рынке IT услуг, с нами надежно!

Вывод записей лога 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