2015-01-20 12 views
5

मैं एक LoggerAdapter का उपयोग लंबे समय से अद्वितीय आईडी के बजाय मेरी अजगर लॉगिंग उत्पादन लिनक्स TIDs जाने के लिए अन्य मॉड्यूल के लिए logging.LoggerAdapter उपलब्ध बनाने के लिए। लेकिन इस तरह से मैं को संशोधित नहीं एक मौजूदा logger लेकिन मैं एक नई वस्तु बनाने:सुरुचिपूर्ण रास्ता

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

अब मैं इस निश्चित मॉड्यूल द्वारा इस्तेमाल किया जा LoggerAdapter चाहते हैं। जब तक मैं एक वैश्विक चर पता है लकड़हारा के रूप में इस्तेमाल किया जा रहा मैं कुछ इस तरह कर सकते हैं:

somemodule.logger = new_logger 

लेकिन यह अच्छा नहीं है - यह केवल कुछ मामलों में काम करता है और आप लकड़हारा द्वारा इस्तेमाल किया चर पता करने की जरूरत मॉड्यूल।

आप विश्व स्तर पर जैसे एक LoggerAdapter उपलब्ध बनाने के लिए एक तरह से जानते हैं बुला s.th. द्वारा

logging.setLogger('mylogger', new_logger) 

या वैकल्पिक रूप से की तरह: वहाँ ps द्वारा मुद्रित की तरह जाने के लिए अजगर logging उत्पादन लिनक्स धागा आईडी किसी अन्य तरह से है?

उत्तर

7

वैकल्पिक रूप से, आप कस्टम लकड़हारा लागू करने के लिए कर सकते हैं, और यह प्रवेश मॉड्यूल में डिफ़ॉल्ट बनाते हैं।

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

आउटपुट नमूना:

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

सुंदर समाधान। :) धन्यवाद! – erip

0

मुझे लगता है कि आप को ओवरराइड LoggerAdapter.process() विधि जरूरत है क्योंकि डिफ़ॉल्ट LoggerAdapter.process विधि कोई कार्य नहीं करेगा, यह वह स्थान है

यहाँ उदाहरण है उदाहरण:

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 
संबंधित मुद्दे