Файл error.log Gunicorn показывает ошибку в журнале, но сам Gunicorn работает.

Вопрос или проблема

Я настроил Nginx с Gunicorn и Django. Все кажется работающим нормально, по крайней мере, я так думал. Однако, когда я проверяю директорию .gunicorn-logs, которая должна быть создана в Docker, как указано в моем скрипте myscript.sh ниже, она показывает 2 файла:

access.log с всеми обращениями к серверу Gunicorn и

error.log, который должен быть пустым, показывает 1 Кб файла.

При проверке я получаю следующее внутри --->

Файл error.log Gunicorn --->
[2024-12-05 04:36:15 +0000] [85] [INFO] Запускается gunicorn 23.0.0
[2024-12-05 04:36:15 +0000] [85] [INFO] Слушает на: http://0.0.0.0:8585 (85)
[2024-12-05 04:36:15 +0000] [85] [INFO] Используется работник: gthread
[2024-12-05 04:36:15 +0000] [88] [INFO] Запускается работник с pid: 88
[2024-12-05 04:36:15 +0000] [89] [INFO] Запускается работник с pid: 89
[2024-12-05 04:36:15 +0000] [90] [INFO] Запускается работник с pid: 90
[2024-12-05 04:36:15 +0000] [91] [INFO] Запускается работник с pid: 91

Файл access.log Gunicorn --->
49.xxx.xxx.xx - - [05/Dec/2024:10:06:26 +0530] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 4158 "-" "PostmanRuntime/7.43.0"
127.0.0.1 - - [05/Dec/2024:10:06:35 +0530] "GET /static/admin/ HTTP/1.1" 302 0 "-" "PostmanRuntime/7.43.0"
127.0.0.1 - - [05/Dec/2024:10:06:36 +0530] "GET /admin/login/?next=/static/admin/ HTTP/1.1" 200 4172 "http://34.xxx.xxx.xx:75/static/admin/" "PostmanRuntime/7.43.0"
127.0.0.1 - - [05/Dec/2024:10:06:42 +0530] "GET /static/admin/ HTTP/1.1" 302 0 "-" "PostmanRuntime/7.43.0"
127.0.0.1 - - [05/Dec/2024:10:06:42 +0530] "GET /admin/login/?next=/static/admin/ HTTP/1.1" 200 4172 "http://34.xxx.xxx.xx:75/static/admin/" "PostmanRuntime/7.43.0"

Файлы логов nginx содержат только заполненный access.log, а error.log пуст.

Файл access.log Nginx ---->
49.xxx.xxx.xx - - [05/Dec/2024:04:36:35 +0000] "GET /static/admin/ HTTP/1.1" 302 0 "-" "PostmanRuntime/7.43.0" "-"
49.xxx.xxx.xx - - [05/Dec/2024:04:36:36 +0000] "GET /admin/login/?next=/static/admin/ HTTP/1.1" 200 1522 "http://34.xxx.xxx.xx:75/static/admin/" "PostmanRuntime/7.43.0" "-"
49.xxx.xxx.xx - - [05/Dec/2024:04:36:42 +0000] "GET /static/admin/ HTTP/1.1" 302 0 "-" "PostmanRuntime/7.43.0" "-"
49.xxx.xxx.xx - - [05/Dec/2024:04:36:42 +0000] "GET /admin/login/?next=/static/admin/ HTTP/1.1" 200 1526 "http://34.xxx.xxx.xx:75/static/admin/" "PostmanRuntime/7.43.0" "-"

Вот как я определил строки, связанные с сервером Gunicorn, внутри Dockerfile.

RUN mkdir -p .gunicorn-logs
RUN touch /opt/.gunicorn-logs/error.log
RUN touch /opt/.gunicorn-logs/access.log
RUN chmod +x /opt/.gunicorn-logs/
cmd myscript.sh

Скрипт myscript.sh, где запускаются как nginx, так и gunicorn —>

#!/bin/sh
nginx -g 'daemon off;' & 
gunicorn mydjangoapi.wsgi:application --config=gunicorn_config_api-1.py

Наконец, gunicorn_config_api-1.py в корневой папке —>

bind = "0.0.0.0:8585"
loglevel = "INFO"
workers = "4"
threads="10"
reload = True

errorlog = "/opt/.gunicorn-logs/error.log"
accesslog = "/opt/.gunicorn-logs/access.log"

Когда вы устанавливаете loglevel = "INFO", вы выбираете сообщения с серьезностью [INFO]. Полностью ожидаемо, что вы их увидите, после того как специально запросили их.

Ответ или решение

Проблема, с которой вы столкнулись, касается поведения Gunicorn и логирования в вашем приложении Django, запущенном в Docker с использованием Nginx в качестве обратного прокси. Давайте разберёмся подробнее.

Анализ ситуации

1. Логи Gunicorn

Вы заметили, что файл error.log в директории .gunicorn-logs весит 1 КБ, хотя вы ожидали, что он будет пустым. Внутри этого лог-файла содержатся записи с уровнями информационных сообщений:

[2024-12-05 04:36:15 +0000] [85] [INFO] Starting gunicorn 23.0.0
[2024-12-05 04:36:15 +0000] [85] [INFO] Listening at: http://0.0.0.0:8585 (85)
[2024-12-05 04:36:15 +0000] [85] [INFO] Using worker: gthread
[2024-12-05 04:36:15 +0000] [88] [INFO] Booting worker with pid: 88
...

Данные записи не являются ошибками, а представляют собой стандартные информационные сообщения, которые Gunicorn генерирует при инициализации. Поскольку вы указали loglevel = "INFO" в настройках вашего Gunicorn, это означает, что ваше приложение будет записывать все сообщения с уровнем "INFO" и выше, включая информационные сообщения о запуске Gunicorn и его воркеров.

2. Логи Nginx

Вы также отметили, что файл error.log для Nginx пуст, в то время как в access.log есть записи запросов. Это может указывать на то, что Nginx корректно обрабатывает запросы и не сталкивается с критическими ошибками, что также является хорошим знаком.

Решение проблемы

Таким образом, у вас нет реальной ошибки, которая мешала бы работе вашего приложения. Однако, если вы хотите избежать записи информационных сообщений в error.log, вы можете изменить уровень логирования в конфигурации Gunicorn. Если вам не нужны сообщения с уровнем "INFO", вы можете установить его на более высокий уровень, например, "WARNING":

loglevel = "WARNING"

Параметры конфигурации Gunicorn

Ваш файл конфигурации для Gunicorn (gunicorn_config_api-1.py) выглядит правильно, и вы правильно инициализируете логи. Убедитесь, что пути к логам являются доступными и имеют необходимые права для записи.

Примечания

  1. Обновите Gunicorn: Убедитесь, что вы используете актуальную версию Gunicorn. Например, в вашем случае версия 23.0.0 может быть устаревшей. Обновление до последней стабильной версии может исправить некоторые проблемы с логгированием.

  2. Проверка прав доступа: Проверьте права доступа к директории .gunicorn-logs и убедитесь, что процесс Gunicorn имеет права на запись в эти файлы.

  3. Использование других уровней логирования: Если вы хотите больше контроля над логированием, вы можете настроить дополнительные параметры или использовать собственные обработчики логов для более детального управления.

Заключение

Вы на правильном пути, и ваше приложение на Django с Nginx и Gunicorn уже корректно функционирует. Логи, которые вы видите, лишь информируют о состоянии сервера и не указывают на ошибки. Рекомендуется следовать указанным выше рекомендациям для оптимизации логирования.

Оцените материал
Добавить комментарий

Капча загружается...