Ведение журнала не работает при запуске приложения пирамиды под uWSGI в режиме императора

Сначала немного предыстории. Я запускаю приложение под 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 выбрать мою конфигурацию ведения журнала, не прыгая через кучу обручей?


person Sean    schedule 18.06.2013    source источник


Ответы (1)


Выяснил это и мог бы также оставить это здесь для потомков, поскольку в Интернете, похоже, очень мало контента о режиме императора. Я добавил «paste-logger = %p» в раздел uwsgi моего INI-файла, и теперь ведение журнала работает. Полный раздел 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
paste-logger = %p
person Sean    schedule 18.06.2013
comment
Что означает %p? - person Piotr Dobrogost; 31.03.2016
comment
%p расширяется до полного абсолютного пути к файлу конфигурации. Вот список доступных магических переменных. - person Sean; 31.03.2016
comment
Я считаю, что правильное использование true для вставки-логгера. uwsgi-docs.readthedocs.io/ ru/последние/. -› uwsgi_opt_true - person hyperknot; 19.01.2017