2016-02-14 17 views
6

sto ispezionare il logging.Logger.manager.loggerDict facendo:Qual è celery.utils.log.ProcessAwareLoggerobject facendo in logging.Logger.manager.loggerDict

import logging 
logging.Logger.manager.loggerDict 

e la dict è la seguente:

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

Le mie domande sono:

  1. Come mai il sedano è coinvolto in registrazione di varie altre applicazioni non sedano? È perché il logging è fatto in modo asincrono e in qualche modo il logging rileva la presenza di sedano e lo usa?
  2. Per due dei miei file che stanno registrando utilizzando logger = logging.getLogger(__name__), vedo uno è PlaceHolderObject e altri due è oggetto celery.utils.log.ProcessAwareLogger, anche se questi ultimi due sono chiamati nelle viste e non nei processi di sedano. Come ha fatto diventa in questo modo poi

Grazie

risposta

5

Sedano si sostituisce il (globale) di classe logger, utilizzando il metodo logging.setLoggerClass, con una classe ProcessAwareLogger che fa un paio di cose: evitare di cercare di login, mentre in un gestore di segnale e aggiungere un nome di processo ai registri. Ciò accade non appena viene configurato il sistema di registrazione di Celery. Stai vedendo questa classe anche sui tuoi logger personali a causa della natura globale di setLoggerClass.

Per quanto riguarda il motivo per cui, esattamente, Celery è progettato in questo modo, penso che dovresti chiedere a uno sviluppatore di Celery, ma in effetti consente a Celery di assicurarsi che la sicurezza del gestore di segnali e il nome del processo siano risolti anche se tu usa i tuoi logger nella tua app.

Il pitone logging documenti notare:

Se si implementa gestori di segnali asincroni utilizzando il modulo di segnalazione, non si può essere in grado di utilizzare la registrazione dall'interno tali gestori. Questo perché le implementazioni di blocco nel modulo di threading non sono sempre rientranti e quindi non possono essere richiamate da tali gestori di segnale.

Celery utilizza signal quindi questo potrebbe essere un motivo per cui si vuole applicare globalmente la sua classe di logger.

+0

Sono stato confuso su ProcessAwareLogger per un tempo molto lungo e grazie per la spiegazione. – dalang