什么是celery.utils.log.ProcessAwareLoggerobject在logging.Logger.manager.loggerDict中做什么

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)

我的问题是:

  1. 为什么芹菜参与各种其他非芹菜应用程序的记录?是因为日志记录以异步方式完成,并且某种程度上日志记录框架检测到芹菜的存在并使用它?
  2. 对于我自己使用的两个文件logger = logging.getLogger(__name__),我看到一个是PlaceHolderObject,另外两个是celery.utils.log.ProcessAwareLogger对象 - 尽管后两个在视图中调用而不是在芹菜进程中调用.那是怎么变成这种方式的呢

谢谢

Jas*_*n S 7

Celery本身使用该logging.setLoggerClass方法替换(全局)记录器类,ProcessAwareLogger该类具有以下几个特性:避免在信号处理程序中尝试记录,并向日志添加进程名称.只要Celery的日志系统设置完毕,就会发生这种情况.由于全球性的特点,你甚至可以在自己的记录器上看到这个课程setLoggerClass.

至于为什么,Celery就是这样设计的,我认为你必须要问Celery的开发人员,但实际上它允许Celery确保即使你使用自己的记录器也能处理信号处理程序的安全和进程名称在你的应用程序中

python logging文档说明:

如果使用信号模块实现异步信号处理程序,则可能无法在此类处理程序中使用日志记录.这是因为线程模块中的锁实现并不总是可重入的,因此不能从这样的信号处理程序中调用.

Celery使用signal这可能是想要全局强制执行其记录器类的原因.