2015-01-20 11 views
5

Używam LoggerAdapter, aby mój log Pythona generował TIDy linuksowe zamiast długich unikalnych identyfikatorów. Ale w ten sposób nie modyfikować istniejący logger ale utworzyć nowy obiekt:Elegancki sposób na rejestrowanie.LoggerAdapter dla innych modułów

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

Teraz chcę to LoggerAdapter być wykorzystywane przez niektórych modułów. Dopóki wiem zmienną globalną używany jako rejestrator mogę zrobić coś takiego:

somemodule.logger = new_logger 

Ale to nie jest przyjemne - to działa tylko w kilku przypadkach, a trzeba wiedzieć, zmienne rejestratora wykorzystywane przez moduły.

Czy znasz sposób na globalne udostępnienie LoggerAdapter? dzwoniąc do s.th. jak

logging.setLogger('mylogger', new_logger) 

lub alternatywnie: jest jakiś inny sposób, aby pozwolić Python logging wyjściowe identyfikatory wątku Linux jak wydrukowane przez ps?

Odpowiedz

7

Alternatywnie można zaimplementować niestandardowy program rejestrujący i ustawić go jako domyślny w module rejestrowania.

Oto przykład:

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

próbka wyjściowa:

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

Piękne rozwiązanie. :) Dzięki! – erip

0

myślę, że trzeba zastąpić() metoda LoggerAdapter.process Ponieważ metoda domyślna LoggerAdapter.process zrobi nic, Oto przykład:

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 
Powiązane problemy