1

首先,一点背景。我正在以皇帝模式在 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 文件中获取日志记录配置。我看到有人建议在 uWSGI 命令行上使用“--ini-paste-logged my.ini”选项,但这在我的情况下不起作用,因为我使用的是皇帝模式。

其他人建议从应用程序中调用 pyramid.paster.setup_logging,但这似乎不是一个理想的解决方案。首先,在开发过程中,我使用 pserve 在本地运行应用程序,它会自动调用 setup_logging,所以我必须根据应用程序运行的环境有条件地调用它。其次,setup_logging 需要配置文件的路径作为参数,而且我需要能够为登台和生产环境使用不同的配置,所以似乎我必须在配置文件中添加一个设置来指定其自身的路径。充其量是一个复杂的解决方案。

知道如何让 uWSGI 获取我的日志记录配置而无需跳过一堆麻烦吗?

4

1 回答 1

7

想通了,不妨把它留给后代,因为网上似乎很少有关于皇帝模式的宝贵内容。我在 INI 文件的 uwsgi 部分添加了“paste-logger = %p”,现在日志记录似乎可以工作了。上下文的完整 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
于 2013-06-18T04:42:14.777 回答