gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:00:36 25 4
gpt4 key购买 nike

我正在通过以下方式检查 logging.Logger.manager.loggerDict:

import logging
logging.Logger.manager.loggerDict

字典如下:

{
'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

我的问题是:

  1. celery 为何会涉及其他各种非 celery 应用程序的日志记录?是不是因为日志记录是以异步方式完成的,并且日志记录框架以某种方式检测到 celery 的存在并使用它?
  2. 对于我自己的两个使用 logger = logging.getLogger(__name__) 记录的文件,我看到一个是 PlaceHolderObject,另外两个是 celery.utils.log.ProcessAwareLogger 对象 - 虽然这些后两者在 View 中调用,而不是在 celery 进程中调用。怎么变成这样了

谢谢

最佳答案

Celery 本身使用 logging.setLoggerClass 方法替换了(全局)记录器类,使用 ProcessAwareLogger 类做几件事:避免尝试记录在信号处理程序中,并将进程名称添加到日志中。一旦设置了 Celery 的日志系统,就会发生这种情况。由于 setLoggerClass 的全局性质,您甚至会在自己的记录器上看到此类。

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

python logging 文档注释:

If you are implementing asynchronous signal handlers using the signal module, you may not be able to use logging from within such handlers. This is because lock implementations in the threading module are not always re-entrant, and so cannot be invoked from such signal handlers.

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

关于python - celery.utils.log.ProcessAwareLoggerobject 在 logging.Logger.manager.loggerDict 中做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35391388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com