使用python3和uWSGI

时间:2017-07-07 18:01:41

标签: python logging uwsgi

我有一个在uWSGI后面运行的python 2 flask app,由supervisord管理。烧瓶应用程序正在将日志写入sys.stdout。然后由uWSGI接收这些日志并由supervisord写入文件。 uWSGI日志写入/ dev / stderr。请参阅下面的supervisord conf。

[program:uwsgi]
command = uwsgi --ini /etc/uwsgi.conf --master
directory = /app
autostart = true
autorestart = true
stdout_logfile = /var/log/myapplication/application.log
stdout_logfile_maxbytes = 50000000
stdout_logfile_backups = 3
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes = 0
stopsignal = INT

这很棒!我已经很好地分离了应用程序日志和uWSGI日志。

我现在已升级到python 3.这一切都很顺利,除了应用程序日志现在最终在uWSGI的stderr中,与uWSGI日志混合在一起。

我已经搜索了uWSGI基座,并且无法在python 2和python 3之间找到这种更改的原因。

我在定义套接字时尝试重定向,就像http://lists.unbit.it/pipermail/uwsgi/2016-February/008383.html中建议的那样,但只是将所有内容(应用程序和uWSGI日志)重定向到/dev/null

我也发现了这个http://lists.unbit.it/pipermail/uwsgi/2016-January/008353.html,但无法找到有关pyimport-shared的任何信息。

有谁知道可能会发生什么?

如果有帮助,我的uWSGI会在这里。

[uwsgi]
uid = www-data
gid = www-data
module = application:application

socket = /run/uwsgi.sock

single-interpreter = true
enable-threads = true
buffer-size = 16384

processes = 4

由于

2 个答案:

答案 0 :(得分:0)

当您运行4个进程时,我想您正在使用--master标志运行uWsgi。在这种情况下,您可能想使用

标志将登录过程委托给主过程。
  

-log-master

以某种方式为我解决了问题。

来自https://github.com/unbit/uwsgi/blob/d960f8fdc36b33c60b7291ca8e32dbb5df22cf15/core/uwsgi.c#L794

  

{“ log-master”,no_argument,0,“将日志委托给主进程”,   uwsgi_opt_true,&uwsgi.log_master,   UWSGI_OPT_MASTER | UWSGI_OPT_LOG_MASTER},

另一个选择:

来自https://github.com/unbit/uwsgi/issues/1601

  

如果需要拆分stdout和stderr,只需重新映射它们的文件   使用在启动时执行的python代码的描述符。他们(FD:1和2)   指向相同的资源,但是如果您被迫监督和   需要拆分它们,唯一的解决方案是关闭并重新打开   相关文件。

     

考虑到您也有“ python”记录器,如果不是   使用unix文件描述符,您更喜欢python日志记录子系统。

     

或者,您可以从堆栈中删除超级用户:)

答案 1 :(得分:0)

这通常与python应用程序中的日志记录配置有关。配置流处理程序时,请使用stream的{​​{1}}值确保其输出指向stdout。