dow*_*123 8 python django logging celery
我正在检查logging.Logger.manager.loggerDict:
import logging
logging.Logger.manager.loggerDict
Run Code Online (Sandbox Code Playgroud)
该词典如下:
{
'nose.case': <celery.utils.log.ProcessAwareLoggerobjectat0x112c8dcd0>,
'apps.friends': <logging.PlaceHolderobjectat0x1147720d0>,
'oauthlib.oauth2.rfc6749.grant_types.client_credentials': <celery.utils.log.ProcessAwareLoggerobjectat0x115c48710>,
'apps.adapter.views': <celery.utils.log.ProcessAwareLoggerobjectat0x116a847d0>,
'apps.accounts.views': <celery.utils.log.ProcessAwareLoggerobjectat0x116976990>,
}
There are more but I truncated it
Run Code Online (Sandbox Code Playgroud)
我的问题是:
logger = logging.getLogger(__name__)
,我看到一个是PlaceHolderObject,另外两个是celery.utils.log.ProcessAwareLogger对象 - 尽管后两个在视图中调用而不是在芹菜进程中调用.那是怎么变成这种方式的呢谢谢
Celery本身使用该logging.setLoggerClass
方法替换(全局)记录器类,ProcessAwareLogger
该类具有以下几个特性:避免在信号处理程序中尝试记录,并向日志添加进程名称.只要Celery的日志系统设置完毕,就会发生这种情况.由于全球性的特点,你甚至可以在自己的记录器上看到这个课程setLoggerClass
.
至于为什么,Celery就是这样设计的,我认为你必须要问Celery的开发人员,但实际上它允许Celery确保即使你使用自己的记录器也能处理信号处理程序的安全和进程名称在你的应用程序中
python logging
文档说明:
如果使用信号模块实现异步信号处理程序,则可能无法在此类处理程序中使用日志记录.这是因为线程模块中的锁实现并不总是可重入的,因此不能从这样的信号处理程序中调用.
Celery使用signal
这可能是想要全局强制执行其记录器类的原因.