Python uWSGI异步函数不';我不知道Django';s日志记录设置
我们正在使用uWSGI为Django应用程序提供服务。我们还利用uWSGI的mules和spooler系统在正常时间运行作业,并在请求/响应周期之外异步执行某些任务 uWSGI处理HTTP请求的部分使用得很好。但是,当使用uWSGI的Python uWSGI异步函数不';我不知道Django';s日志记录设置,python,django,logging,uwsgi,Python,Django,Logging,Uwsgi,我们正在使用uWSGI为Django应用程序提供服务。我们还利用uWSGI的mules和spooler系统在正常时间运行作业,并在请求/响应周期之外异步执行某些任务 uWSGI处理HTTP请求的部分使用得很好。但是,当使用uWSGI的cron和mulefunc功能时,通常根本不会配置记录器——您将调用log.error(),异常就会消失。我们发现了一个奇怪的解决方法,我将在下面解释 下面是我们的日志设置,在settings.py中。StreamHandler默认路由到stderr,因此我们应该看
cron
和mulefunc
功能时,通常根本不会配置记录器——您将调用log.error(),异常就会消失。我们发现了一个奇怪的解决方法,我将在下面解释
下面是我们的日志设置,在settings.py
中。StreamHandler默认路由到stderr,因此我们应该看到任何级别为DEBUG和更高级别的日志路由到stderr
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'verbose'
}
},
'loggers': {
'': {
'handlers': ['console'],
'level': 'NOTSET',
}
}
}
日志记录={
“版本”:1,
“禁用现有日志记录器”:True,
“格式化程序”:{
“冗长的”:{
“格式”:“%(levelname)s%(astime)s%(模块)s%(进程)d%(线程)d%(消息)s”
},
},
“处理程序”:{
“控制台”:{
“级别”:“调试”,
'class':'logging.StreamHandler',
“格式化程序”:“详细”
}
},
“伐木工人”:{
'': {
“处理程序”:[“控制台”],
“级别”:“未设置”,
}
}
}
下面是一个不起作用的例子:
from uwsgidecorators import mulefunc
log = logging.getLogger(__name__)
@timer(10, target="mule")
def test_mule_logging(signum):
log.error("You'll never see this message")
从uwsgidecorators导入mulefunc
log=logging.getLogger(_名称__)
@计时器(10,target=“mule”)
def测试记录(信号):
log.error(“您永远不会看到此消息”)
然而,有一个非常奇怪的解决方法。如果您导入Django的设置,并访问其中的一个键,那么记录器将神奇地工作。例如:
from django.conf import settings
getattr(settings, "doesntmatter", None)
from uwsgidecorators import timer
import logging
log = logging.getLogger(__name__)
@timer(10, target="mule")
def test_mule_logging(signum):
log.error("I WILL see this log!")
从django.conf导入设置
getattr(设置,“doesntmatter”,无)
从uwsgidecorators导入计时器
导入日志记录
log=logging.getLogger(_名称__)
@计时器(10,target=“mule”)
def测试记录(信号):
log.error(“我将看到此日志!”)
不过,这似乎是一个可怕的解决办法。我认为你描述的行为是有道理的 在普通worker中,uwsgi加载一个WSGI应用程序,使django加载设置,并作为配置全局Python日志系统的一部分。django应用程序运行并包含日志语句的库代码最终由日志配置处理(无需知道django是否存在或日志系统是否已配置) 在mule中,uwsgi只运行您给它的代码,而不是为普通工作人员定义的wsgi模块/脚本,因此没有配置日志系统。mule仍然在相同的环境中运行(uid、gid、chdir、virtualenv、pythonpath、像DJANGO_SETTINGS_MODULE这样的环境变量),因此调用
DJANGO.setup()
(或DJANGO.configure_SETTINGS
)将导入您的设置并配置全局日志系统(全局到作为mule工作者的Python进程),修复您的日志记录呼叫
拼图的最后一块:django.conf.settings
模块是一个特殊的惰性对象,因此它可以在django完成自身配置之前由各个模块导入,并推迟真正加载设置,直到有人尝试访问模块属性。在现代Django版本中,可以通过Django.setup()
更明确地获得这种行为