Создание простого отчета
Для нашей последней задачи давайте создадим простой HTML-отчет, обобщающий ключевую информацию из нашего файла журнала. Для этой более сложной операции мы будем использовать скрипт AWK, сохраненный в отдельном файле.
Этот шаг объединяет несколько идей AWK из предыдущих разделов:
- счетчики, такие как
total++
- массивы, такие как
ip_count[$3]++
- блок
END, который выводит итоговую сводку
Если на первый взгляд скрипт кажется длинным, сосредоточьтесь на одном блоке за раз. Вам не нужно запоминать весь файл перед его запуском.
Сначала создайте файл с именем log_report.awk со следующим содержимым:
Совет: Скопируйте приведенный ниже контент и вставьте его в свой терминал, чтобы создать файл.
cat << 'EOF' > log_report.awk
BEGIN {
print "<html><body>"
print "<h1>Server Log Summary</h1>"
total = 0
errors = 0
}
{
total++
if ($6 >= 400) errors++
ip_count[$3]++
resource_count[$5]++
}
END {
print "<p>Total requests: " total "</p>"
print "<p>Error rate: " (errors/total) * 100 "%</p>"
print "<h2>Top 5 IP Addresses</h2>"
print "<ul>"
for (ip in ip_count) {
top_ips[ip] = ip_count[ip]
}
n = asort(top_ips, sorted_ips, "@val_num_desc")
for (i = 1; i <= 5 && i <= n; i++) {
for (ip in ip_count) {
if (ip_count[ip] == sorted_ips[i]) {
print "<li>" ip ": " ip_count[ip] " requests</li>"
break
}
}
}
print "</ul>"
print "<h2>Top 5 Requested Resources</h2>"
print "<ul>"
for (resource in resource_count) {
top_resources[resource] = resource_count[resource]
}
n = asort(top_resources, sorted_resources, "@val_num_desc")
for (i = 1; i <= 5 && i <= n; i++) {
for (resource in resource_count) {
if (resource_count[resource] == sorted_resources[i]) {
print "<li>" resource ": " resource_count[resource] " requests</li>"
break
}
}
}
print "</ul>"
print "</body></html>"
}
EOF
Давайте разберем этот скрипт AWK по частям:
-
Блок BEGIN: Выполняется до обработки любых входных строк
BEGIN {
print "<html><body>" ## Начало HTML-структуры
print "<h1>Server Log Summary</h1>"
total = 0 ## Инициализация счетчика общего количества запросов
errors = 0 ## Инициализация счетчика запросов с ошибками
}
-
Основной блок обработки: Выполняется для каждой строки входного файла
{
total++ ## Увеличение счетчика общего количества запросов
if ($6 >= 400) errors++ ## Подсчет ответов с ошибками (коды состояния >= 400)
ip_count[$3]++ ## Подсчет запросов по IP-адресу (поле 3)
resource_count[$5]++ ## Подсчет запросов по ресурсу (поле 5)
}
-
Блок END: Выполняется после обработки всех входных строк
END {
## Вывод сводной статистики
print "<p>Total requests: " total "</p>"
print "<p>Error rate: " (errors/total) * 100 "%</p>"
## Обработка и вывод топ-5 IP-адресов
## ...
## Обработка и вывод топ-5 запрошенных ресурсов
## ...
print "</body></html>" ## Конец HTML-структуры
}
Прежде чем двигаться дальше, обратите внимание на общий поток:
BEGIN выводит открывающие HTML-теги и инициализирует счетчики.
- Средний блок обрабатывает каждую строку журнала и обновляет итоговые значения.
END выводит итоговый отчет после того, как все строки были проанализированы.
Давайте рассмотрим логику сортировки для топ-IP (раздел ресурсов работает так же):
## Копируем счетчики в новый массив для сортировки
for (ip in ip_count) {
top_ips[ip] = ip_count[ip]
}
## Сортируем массив по значению в порядке убывания
n = asort(top_ips, sorted_ips, "@val_num_desc")
## Выводим топ-5 записей
for (i = 1; i <= 5 && i <= n; i++) {
## Находим исходный IP, соответствующий этому количеству
for (ip in ip_count) {
if (ip_count[ip] == sorted_ips[i]) {
print "<li>" ip ": " ip_count[ip] " requests</li>"
break
}
}
}
В этом скрипте:
- Функция
asort() сортирует массив
"@val_num_desc" — это специальный аргумент, который указывает сортировать численно по значению в порядке убывания
- Вложенные циклы находят и выводят топ-5 записей
Вы можете представить вложенные циклы так:
- первый цикл определяет, какие значения попадают в топ-5
- второй цикл находит, какой IP-адрес или ресурс соответствует каждому значению
Этот шаблон поиска более продвинутый, чем предыдущие шаги, поэтому это нормально, если эта часть лабораторной работы кажется вам настоящим программированием, а не просто однострочной командой.
Теперь давайте запустим наш скрипт AWK для создания отчета:
awk -f log_report.awk server_logs.txt > log_report.html
Опция -f указывает AWK прочитать скрипт из указанного файла:
-f log_report.awk — считывает скрипт AWK из файла log_report.awk
server_logs.txt — обрабатывает этот файл с помощью скрипта
> log_report.html — перенаправляет вывод в файл log_report.html
Вы можете просмотреть содержимое отчета с помощью команды cat:
cat log_report.html
Если HTML-вывод сложно просматривать в терминале, сначала посмотрите только первую часть:
head -n 15 log_report.html
Этот отчет содержит сводку общего количества запросов, частоту ошибок, топ-5 IP-адресов и топ-5 запрошенных ресурсов. В реальной ситуации вы могли бы открыть этот HTML-файл в веб-браузере для удобного просмотра.
Подход, который мы использовали в этом скрипте, демонстрирует, как AWK можно использовать для более сложных задач анализа данных. Вы можете расширить этот скрипт, добавив дополнительную статистику или другие визуализации в зависимости от ваших конкретных потребностей.