Сначала немного предыстории. Я запускаю приложение под uWSGI в режиме императора. Командная строка uWSGI:
uwsgi --master --emperor /etc/uwsgi --die-on-term --uid uwsgi --gid uwsgi
Файл INI для моего приложения находится в /etc/uwsgi, и он успешно найден при запуске uWSGI. Разделы конфигурации uwsgi и ведения журнала моего приложения:
[uwsgi]
socket = /tmp/uwsgi.sock
master = true
processes = 8
threads = 4
harakiri = 60
harakiri-verbose = true
limit-post = 52428800
post-buffering = 8192
listen = 256
max-requests = 1000
buffer-size = 32768
no-orphans = true
logto = /var/log/uwsgi/my_app.log
log-slow = 1000
virtualenv = /usr/local/python/my_app
paste = config:%p
[loggers]
keys = root, my_app
[handlers]
keys = console
[formatters]
keys = generic
[logger_root]
level = WARN
handlers = console
[logger_my_app]
level = DEBUG
handlers =
qualname = my_app
[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic
[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s
Nginx настроен на проксирование сайта и делает это успешно. Приложение запускается и работает нормально. У меня нет проблем с доступом к нему из веб-браузера. Проблема начинается, когда я пытаюсь записать что-то из своего приложения, например:
import logging
log = logging.getLogger(__name__)
log.info('hello world')
В моем журнале вместо "hello world" я вижу следующее:
Не удалось найти обработчики для логгера "my_app.my_module"
Похоже, что uWSGI не получает конфигурацию ведения журнала из моего INI-файла. Я видел, как люди предлагали использовать параметр «--ini-paste-logged my.ini» в командной строке uWSGI, но в моем случае это не сработает, так как я использую режим императора.
Другие предлагали вызывать пирамиду.paster.setup_logging из приложения, но это кажется неидеальным решением. Во-первых, во время разработки я запускаю приложение локально с помощью pserve, который автоматически вызывает setup_logging, поэтому мне пришлось бы вызывать его условно в зависимости от того, в какой среде работает приложение. Во-вторых, setup_logging требует в качестве аргумента путь к файлу конфигурации, и мне нужно иметь возможность использовать разные конфигурации для промежуточной и производственной среды, поэтому, похоже, мне придется сделать что-то вроде добавления параметра в файл конфигурации, который указывает путь к себе. Запутанное решение в лучшем случае.
Любая идея, как я могу заставить uWSGI выбрать мою конфигурацию ведения журнала, не прыгая через кучу обручей?