Статистика запросов на основе логов Bind

На работе руководство захотело посмотреть статистику DNS-запросов за сутки. Скачал логи к себе, да бы лишний раз не тревожить сервер. Коллега попытался запихнуть их в Excel, но каждый из двадцати пяти лог-файлов имеет размер в 1 (один) гигабайт (это логи работы bind'а чуть меньше, чем за полдня). Excel что-то показал и молча скончался. Первое, что пришло в голову, так это написать небольшой скрипт, который переработает эти 25 гигабайт информации и выдаст вполне себе удобный для просмотра файла.

В принципе, ничего сложного в этом shell-скрипте нет, буквально пишется на «коленке» за пять минут. Изначально написал однострочник, с помощью которого и получил итоговый файл. В итоге, чуть расширил возможности этого однострочника и получил такой вот скрипт.

В самом начале задаём пару переменных: путь хранения логов, каталог temp и количество строк в результирующем файле.

#!/bin/bash
# Каталог, где лежат логи
LOG_DIR=~/tmp/bind_log

# Промежуточные варианты будет складывать в каталог temp
TEMP_DIR=~/tmp/temp
# Количество строк в результирующем файле
COUNT_LINES=1000

Проверим, существует ли каталог temp по указанному пути. Если не существует, то создадим его.

if ! [ -d $TEMP_DIR/ ]; then
    mkdir $TEMP_DIR
fi

В логах необходимая нам информация находится в восьмом поле (разделитель пробел). Извлекаем домены из всех лог-файлов и помещаем в один.

for file in $LOG_DIR/*; do
    awk '{print $8}' $file >> $TEMP_DIR/domains.txt
done

Затем оставляем не уникальные, т.е. повторяющиеся, домены и считаем их количество. Затем сортируем полученный результатов по убыванию, после чего оставляем только первую тысячу записей. Полученный результат сохрянем в файл.

sort -n $TEMP_DIR/domains.txt | uniq -cd | sort -nrk 1 | head -n $COUNT_LINES > $TEMP_DIR/domains_result.txt

В конце скрипта произведём небольшую чистку.

if [ -f $TEMP_DIR/domains.txt ]; then
    rm $TEMP_DIR/domains.txt
fi

Итоговый файл, который и был отправлен руководству.

14748927 dns.msftncsi.com
10333977 a.root-servers.net
7906481 www.google.com
3328788 ya.ru
2535493 mail.ru
2441392 google.com
2299573 graph.facebook.com
2039593 e6858.dsce9.akamaiedge.net
1777954 mc.yandex.ru
1766014 play.googleapis.com
1725436 rosenberg.appmetrica.yandex.net
1677673 googleads.g.doubleclick.net
1647791 www.youtube.com
1606237 yandex.ru
1527312 www.googleapis.com
1371390 google.ru
1317138 vk.com
1280393 time.nist.gov
1265357 graph.instagram.com
…

Собственно, как я и писал в начале этой статьи ничего сложного нет, и наверняка у многих подобные скрипты имеются на серверах.

При желании полученный итоговый файл можно засунуть в тот же Excel и получить красивые диаграммы, если кому-то простые цифры покажутся не очень наглядными.