Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python uWSGI异步函数不';我不知道Django';s日志记录设置_Python_Django_Logging_Uwsgi - Fatal编程技术网

Python uWSGI异步函数不';我不知道Django';s日志记录设置

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,因此我们应该看

我们正在使用uWSGI为Django应用程序提供服务。我们还利用uWSGI的mules和spooler系统在正常时间运行作业,并在请求/响应周期之外异步执行某些任务

uWSGI处理HTTP请求的部分使用得很好。但是,当使用uWSGI的
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()
更明确地获得这种行为