2015-01-20 4 views
5

Io uso un LoggerAdapter per consentire al mio python di registrare output TID Linux invece degli ID univoci lunghi. Ma in questo modo non modificarne uno esistente logger ma creare un nuovo oggetto:Modo elegante per rendere logging.LoggerAdapter disponibile ad altri moduli

new_logger = logging.LoggerAdapter(
        logger=logging.getLogger('mylogger'), 
        extra=my_tid_extractor()) 

Ora voglio che questo LoggerAdapter essere utilizzato da alcuni moduli. Finché io so una variabile globale viene utilizzato come registratore posso fare qualcosa di simile:

somemodule.logger = new_logger 

Ma questo non è bello - funziona solo in un paio di casi ed è necessario sapere le variabili logger utilizzati da i moduli.

Conoscete un modo per rendere disponibile a livello globale LoggerAdapter ad es. chiamando s.th. come

logging.setLogger('mylogger', new_logger) 

O, in alternativa: c'è qualche altro modo per lasciare che gli ID di thread Linux Python logging uscita come stampato da ps?

risposta

7

In alternativa, è possibile implementare il registratore personalizzato e renderlo predefinito nel modulo di registrazione.

Ecco esempio:

import logging 
import ctypes 

SYS_gettid = 186 
libc = ctypes.cdll.LoadLibrary('libc.so.6') 

FORMAT = '%(asctime)-15s [thread=%(tid)s] %(message)s' 
logging.basicConfig(level=logging.DEBUG, format=FORMAT) 

def my_tid_extractor(): 
    tid = libc.syscall(SYS_gettid) 
    return {'tid': tid} 

class CustomLogger(logging.Logger): 

    def _log(self, level, msg, args, exc_info=None, extra=None): 
     if extra is None: 
      extra = my_tid_extractor() 
     super(CustomLogger, self)._log(level, msg, args, exc_info, extra) 

logging.setLoggerClass(CustomLogger) 


logger = logging.getLogger('test') 
logger.debug('test') 

campione di uscita:

2015-01-20 19:24:09,782 [thread=5017] test 
+0

Bella soluzione. :) Grazie! – erip

0

Penso che è necessario sovrascrivere il metodo LoggerAdapter.process() Poiché il metodo di default LoggerAdapter.process non fa nulla, Ecco esempio:

import logging 
import random 
L=logging.getLogger('name') 

class myLogger(logging.LoggerAdapter): 
    def process(self,msg,kwargs): 
     return '(%d),%s' % (self.extra['name1'](1,1000),msg) ,kwargs 

#put the randint function object 
LA=myLogger(L,{'name1':random.randint}) 

#now,do some logging 
LA.debug('some_loging_messsage') 

out>>DEBUG:name:(167),some_loging_messsage