uWSGI / Flask / Python日志在一段时间后停止

时间:2015-06-17 09:53:23

标签: python logging flask uwsgi

我使用python记录器设置了uWSGI / Flask。虽然只有一些工作人员的日志才能登录日志,但过了一段时间后,甚至那些日志根本就不再出现了。我的假设是,当uWSGI重新启动(克隆)工作程序时,日志记录会以某种方式被破坏。有什么想法吗?

app/server.py

app = Flask(...)
handler = logging.StreamHandler()
app.logger.addHandler(handler)
app.run()

uWSGI:

uwsgi --emperor /etc/uwsgi/apps-enabled/*.ini --die-on-term --uid www-data --gid www-data --logto /var/www/app.com/logs/uwsgi/emperor.log --socket /tmp/uwsgi/emperor.sock --enable-threads --master --single-interpreter --log-reopen --chmod-socket=770

apps-enabled / app-0.ini和apps-enabled / app-1.ini如下所示:

module=server:app
enable-threads=true
single-interpreter=true
master=true
chdir=/var/www/app.com/app
env=APPLICATION_ENVIRONMENT=production
venv=/var/www/app.com/virtualenv

logto=/var/www/app.com/logs/uwsgi/app.com-0.log
log-reopen=true
chmod-socket=770
buffer-size=65535

lazy-apps=true
max-requests=5000
heartbeat=15

for=0 1 2 3 4 5 6 7
socket=/tmp/uwsgi/app.0.%(_).sock
endfor=

processes=8

map-socket=0:1
map-socket=1:2
map-socket=2:3
map-socket=3:4
map-socket=4:5
map=socket=5:6
map=socket=6:7
map=socket=7:8

我也尝试使用SysLogHandler得到相同的结果。

3 个答案:

答案 0 :(得分:1)

我不确定这会对您的情况有所帮助,但您可以尝试在uWSGI中使用post forking。

postfork装饰者只是门票。您可以声明多个postfork任务。每个修饰函数将在每个fork()之后按顺序执行。

@postfork
def init_logging():
    app.logger.addHandler(handler)

或者您可以在lazy-apps=true中指定uwsgi.ini

详细信息:http://uwsgi-docs.readthedocs.io/en/latest/PythonDecorators.htmlhttp://uwsgi-docs.readthedocs.io/en/latest/articles/TheArtOfGracefulReloading.html

答案 1 :(得分:0)

我可以肯定地告诉你,重启uwsgi不应该停止记录。我有nginx-uwsgi-django服务器,我一直重启我的uwsgi服务器,我的日志永远不会停止。这是我的ini文件的样子:可能你可以调整你的ini文件,看看它是否有效。

1 #mysite_uwsgi.ini
2 [uwsgi]
3 
4 # Django-related settings
5 # the base directory (full path)
6 chdir           = /home/user/bdapps_stage
7 # Django's wsgi file
8 module          = mysite.wsgi:application
9 # the virtualenv (full path)
10 home            = /home/user/.conda/envs/mysite_env/
11 
12 # process-related settings
13 # master
14 master          = true
15 # maximum number of worker processes
16 processes       = 3
17 # maximum number of threads to use
18 # threads
19 # the socket (use the full path to be safe
20 socket          = /home/user/mysite/mysite.sock
21 # ... with appropriate permissions - may be needed
22 chmod-socket    = 666
23 #set the sockets listen queue size
24 #listen
25 # clear environment on exit
26 vacuum          = true

以下是我重启uwsgi的方法

kill -SIGHUP [pid id of your uwsgi master]

请注意,您使用ini文件为uwsgi提供的命令只能使用一次来启动uwsgi服务器。当你想重新启动时,我建议你使用

记下uwsgi master的pid
 ps -ef | grep uwsgi 

并运行上面的kill命令。

答案 2 :(得分:0)

尝试在一段时间后停止日志记录的另一个可能原因。可以将uWSGI设置为放弃特权(这是一个好主意)。但是,在此事件之后,将使用cat /etc/*-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g' | sed 's/"//g' [0]设置:

CentOS Linux 7 (Core)

希望它可以帮助某人。

[0] https://uwsgi-docs.readthedocs.io/en/latest/Options.html#logto2