首先,介绍一下背景。我在 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”,而是以下内容:
No handlers could be found for logger "my_app.my_module"
看来 uWSGI 没有从我的 INI 文件中获取日志配置。我见过有人建议在 uWSGI 命令行上使用“--ini-paste-logged my.ini”选项,但这在我的情况下不起作用,因为我使用的是皇帝模式。
其他人建议从应用内调用 pyramid.paster.setup_logging ,但这似乎不是一个理想的解决方案。首先,在开发过程中,我使用自动调用 setup_logging 的 pserve 在本地运行应用程序,因此我必须根据应用程序运行的环境有条件地调用它。其次,setup_logging 需要配置文件的路径作为参数,而且我需要能够为暂存和生产环境使用不同的配置,所以我似乎必须做一些事情,比如在配置文件中添加一个设置来指定自身的路径。充其量是一个复杂的解决方案。
知道如何让 uWSGI 获取我的日志记录配置而无需跳过一堆障碍吗?
请您参考如下方法:
弄明白了,不妨把它留在这里供后人使用,因为网上关于皇帝模式的内容似乎很少。我将“paste-logger = %p”添加到我的 INI 文件的 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
paste-logger = %p
