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