2016-02-14 5 views
6

で何をしているのです。celery.utils.log.ProcessAwareLoggerobjectは私が行うことでlogging.Logger.manager.loggerDictを検査しています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. セロリは、様々な他の非セロリのアプリのログ記録に関与しているどのように来ますか?それはロギングが非同期の方法で行われ、何らかの形でロギングフレームワークがセロリの存在を検出してそれを使用するためですか?
  2. logger = logging.getLogger(__name__)を使用してログを記録している私の2つのファイルについては、PlaceHolderObjectと他の2つがcelery.utils.log.ProcessAwareLoggerオブジェクトです。後者の2つはビューで呼び出され、セロリプロセスでは呼び出されません。どのようにそれは、その後

おかげ

答えて

5

セロリ自体、このようになった物事のカップルを行いProcessAwareLoggerクラスで、logging.setLoggerClass方法を使用して、(グローバル)ロガークラスを置き換える:中ながら、ログインしようとして避けますシグナルハンドラ、ログにプロセス名を追加することができます。これは、セロリのログシステムが設定されるとすぐに起こります。グローバル性がsetLoggerClassであるため、あなた自身のロガーでもこのクラスを見ています。

セロリのように設計されている理由は、セロリの開発者に質問しなければならないと思うが、効果的にセロリがシグナルハンドラの安全性とプロセス名を保証することができるあなたのアプリで独自のロガーを使用してください。

のpython loggingドキュメントは注意してください。

あなたは信号モジュールを使用して非同期シグナルハンドラを実装している場合、あなたは、このようなハンドラ内からロギングを使用することはできません。これは、スレッド化モジュール内のロック実装が常に再入可能であるとは限らず、そのようなシグナルハンドラから呼び出すことができないためです。

セロリはsignalを使用しているため、ロガークラスをグローバルに強制したいことが考えられます。

+0

私は非常に長い時間のためにProcessAwareLoggerを混乱させて、あなたの説明に感謝します。 – dalang