Skip to main content
 首页 » 编程设计

python之在皇帝模式下在 uWSGI 下运行 Pyramid 应用程序时日志记录不起作用

2025年05月04日20jackei

首先,介绍一下背景。我在 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