Введение
Любое программное приложение должно вести журнал событий для их регистрации.
В частности, логи доступа Nginx записывают IP-адреса клиентов, URL-адреса и коды состояния HTTP для запросов к веб-серверу.
В этой статье мы рассмотрим Python-скрипт, который генерирует пример журнала доступа nginx для тестирования и отладки.
🌐 Nginx или Apache: Сравнение двух ведущих веб-серверов
Скрипт:
import random import time import argparse # create an ArgumentParser object and set the description and default values for the optional arguments parser = argparse.ArgumentParser(description='Generate a sample access log.') parser.add_argument('--filename', type=str, help='Name of the log file', default='access.log') parser.add_argument('--lines', type=int, help='Number of log lines to generate', default=2000) # create a list of IP addresses to use in the log lines ip_list = ['192.168.1.1', '192.168.1.2', '192.168.1.3', '192.168.1.4', '192.168.1.5', '192.168.1.6', '192.168.1.7', '192.168.1.8', '192.168.1.9', '192.168.1.10', '192.168.1.11', '192.168.1.12', '192.168.1.13', '192.168.1.14', '192.168.1.15', '192.168.1.16', '192.168.1.17', '192.168.1.18', '192.168.1.19', '192.168.1.20', '192.168.1.21', '192.168.1.22', '192.168.1.23', '192.168.1.24', '192.168.1.25', '192.168.1.26', '192.168.1.27', '192.168.1.28', '192.168.1.29', '192.168.1.30', '192.168.1.31', '192.168.1.32', '192.168.1.33', '192.168.1.34', '192.168.1.35', '192.168.1.36', '192.168.1.37', '192.168.1.38', '192.168.1.39', '192.168.1.40', '192.168.1.41', '192.168.1.42', '192.168.1.43', '192.168.1.44', '192.168.1.45', '192.168.1.46', '192.168.1.47', '192.168.1.48', '192.168.1.49', '192.168.1.50', '2001:db8:0:1:0:0:0:1', '2001:db8:0:1:0:0:0:2', '2001:db8:0:1:0:0:0:3', '2001:db8:0:1:0:0:0:4', '2001:db8:0:1:0:0:0:5', '2001:db8:0:1:0:0:0:6', '2001:db8:0:1:0:0:0:7', '2001:db8:0:1:0:0:0:8', '2001:db8:0:1:0:0:0:9', '2001:db8:0:1:0:0:0:a', '2001:db8:0:1:0:0:0:b', '2001:db8:0:1:0:0:0:c', '2001:db8:0:1:0:0:0:d', '2001:db8:0:1:0:0:0:e'] # create a list of user agent strings to use in the log lines user_agents = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0', 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 OPR/45.0.2552.898', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'] args = parser.parse_args() # open the log file in write mode and create log lines using the specified number of lines with open(args.filename, 'w') as f: for i in range(args.lines): ip = random.choice(ip_list) timestamp = time.strftime('%d/%b/%Y:%H:%M:%S %z', time.localtime()) method = random.choice(['GET', 'POST', 'PUT', 'DELETE']) url = '/' + ''.join(random.choices('abcdefghijklmnopqrstuvwxyz', k=random.randint(1, 10))) refurl = random.choice(['https://www.example.com/','https://www.google.com/','https://www.ibm.com/','https://www.msn.com/']) protocol = 'HTTP/1.1' status_code = random.choice([200, 201, 204, 301, 302, 400, 401, 403, 404, 500]) size = random.randint(100, 10000) user_agent = random.choice(user_agents) # create the log line with the chosen values and write it to the file line = f"{ip} - - [{timestamp}] \"{method} {url} {protocol}\" {status_code} {size} \"{refurl}\" \"{user_agent}\"\n" f.write(line)
Использование
Запустить этот скрипт можно с помощью следующей команды:
python generate_logs.py --filename mylog.log --lines 5000
В результате будет сгенерировано 5000 строк журнала в файле с именем mylog.log.
Если опустить аргументы –filename и –lines, то по умолчанию будут использоваться значения access.log и 2000 строк.
Принцип работы
Скрипт на языке Python использует встроенные модули random и time для генерации случайных данных для каждой строки лога.
Также он использует модуль argparse для анализа аргументов командной строки, что позволяет нам указать имя генерируемого лог-файла и количество генерируемых лог-строк.
Ниже приведено описание основных частей скрипта:
- Разбор аргументов командной строки: Модуль argparse используется для разбора необязательных аргументов –filename и –lines, которые задают имя генерируемого лог-файла и количество генерируемых лог-строк соответственно.
- Генерация строк : Цикл for генерирует строки журнала путем многократной итерации args.lines.
- На каждой итерации из списка IP-адресов выбирается случайный IP-адрес, с помощью модуля time генерируется текущая временная метка в заданном формате, выбирается случайный HTTP-метод, генерируется случайный URL-путь из 1-10 строчных букв, выбирается случайный URL-адрес реферера, устанавливается протокол HTTP/1.1, выбирается случайный код состояния HTTP, генерируется случайный размер ответа от 100 до 10000 байт, выбирается случайная строка агента пользователя. Эти значения используются для построения строки журнала, которая записывается в файл лога.
- Запись строк журнала в файл: Оператор with используется для открытия файла журнала в режиме записи и создания строк журнала с указанным количеством строк. Метод write() используется для записи каждой строки журнала в файл.
Заключение
Мы рассмотрели Python-скрипт, позволяющий легко и быстро создавать примеры логов доступа к Nginx для тестирования и отладки.
Для разбора аргументов командной строки скрипт использует встроенные модули random и time, а также модуль argparse.
Сформированный лог-файл содержит информацию о каждом запросе к веб-серверу, такую как IP-адрес клиента, запрашиваемый URL и код состояния HTTP, возвращаемый сервером.
см. также:
- 📜 Как настроить ротацию логов NGINX
- 📂 Как удалить NGINX из Ubuntu
- 🌐 Сопоставление URL с другим путем в Nginx
- 🌐 Как создать пользовательскую страницу ошибки 404 в NGINX
- ☸️ Как развернуть Nginx в кластере Kubernetes
- 🌐 Как разместить несколько сайтов на Nginx с одним и тем же доменом (FQDN)