2017-07-24 24 views
0

無法讓這個工作。可能對python日誌記錄模塊缺乏瞭解。用python日誌記錄格式插入變量的正確方法

用例 - 在所有日誌消息上打印一個變量。即「jobID」。當此實用程​​序的多個實例將在同一臺服務器上並行運行時 - syslog或../log/messages可以基於此jobID進行實時解析。下面是嘗試用LoggerAdapter方法(誤差線註釋) -

def startlog(self, log_folder, testname=None): 
    if not os.path.exists(log_folder): 
     os.makedirs(log_folder) 

    ltime = datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S') 

    if testname: 
     logfile = "%s/%s_log_%s.log" % (log_folder, testname, ltime) 
    else: 
     logfile = "%s/log_%s.log" % (log_folder, ltime) 
     logger = logging.getLogger() 
     logger.setLevel(logging.INFO) 

    formated = logging.Formatter('%(asctime)s - %(levelname)s - %(module)10s - %(funcName)10s - %(message)s') 
    #What is desired is - 
    #formated = logging.Formatter('%(asctime)s - %(jobid)s - %(levelname)s - %(module)10s - %(funcName)10s - %(message)s') 

    if not testname: 
     fh = logging.FileHandler(filename=logfile) 
     fh.setFormatter(formated) 
     logger.addHandler(fh) 
     ch = logging.StreamHandler(sys.stdout) 
     ch.setFormatter(formated) 
     logger.addHandler(ch) 
     # Next line errors - 
     # logger = logging.LoggerAdapter(logger, {"jobid": self.jobdata.jobid}) 
     return logger 
    else: 
     fh = logging.FileHandler(filename=logfile) 
     fh.setFormatter(formated) 
     self.log.addHandler(fh) 
     # Next line errors - 
     # logger = logging.LoggerAdapter(self.log, {"jobid": self.jobdata.jobid}) 
     return fh 

第二嘗試使用過濾器:

def startlog(self, log_folder, t_name=None): 
    if not os.path.exists(log_folder): 
     os.makedirs(log_folder) 

    ltime = datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S') 

    if t_name: 
     logfile = "%s/%s_log_%s.log" % (log_folder, t_name, ltime) 
    else: 
     logfile = "%s/log_%s.log" % (log_folder, ltime) 
     root = logging.getLogger() 
     root.setLevel(logging.INFO) 
     root.addFilter(ContextFilter(self.jobdata.jobid)) 

    formated = logging.Formatter('%(asctime)s - %(jobid)s - %(levelname)s - %(module)10s - %(funcName)10s - %(message)s') 

    if not t_name: 
     fh = logging.FileHandler(filename=logfile) 
     fh.setFormatter(formated) 
     root.addHandler(fh) 
     ch = logging.StreamHandler(sys.stdout) 
     ch.setFormatter(formated) 
     root.addHandler(ch) 
     return root 
    else: 
     fh = logging.FileHandler(filename=logfile) 
     fh.setFormatter(formated) 
     self.log.addHandler(fh) 
     return fh 


class ContextFilter(logging.Filter): 
    """ 
    This is a filter which injects contextual information into the log. 
    """ 
    def __init__(self, jobid): 
     self.jobid = jobid 

    def filter(self, record): 
     record.jobid = self.jobid 
     return True 

面對過濾器的問題是從其它模塊(的paramiko - transport.py) 'KeyError異常'。類似How to properly add custom logging filters in Python modules

Traceback (most recent call last): 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 859, in emit 
    msg = self.format(record) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 732, in format 
    return fmt.format(record) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/logging/__init__.py", line 474, in format 
    s = self._fmt % record.__dict__ 
KeyError: 'jobid' 
Logged from file transport.py, line 1567 

回答

0

笨我,我需要添加過濾器到日誌處理程序。這工作到目前爲止 -

def startlog(self, log_folder, t_name=None): 
    if not os.path.exists(log_folder): 
     os.makedirs(log_folder) 

    ltime = datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S') 

    if t_name: 
     logfile = "%s/%s_log_%s.log" % (log_folder, t_name, ltime) 
    else: 
     logfile = "%s/log_%s.log" % (log_folder, ltime) 
     logger = logging.getLogger() 
     logger.setLevel(logging.INFO) 

    formated = logging.Formatter('%(asctime)s - %(jobid)s - %(levelname)s - %(module)10s - %(funcName)10s - %(message)s') 
    formatted_file = logging.Formatter('%(asctime)s - %(levelname)s - %(module)10s - %(funcName)10s - %(message)s') 
    if not t_name: 
     fh = logging.FileHandler(filename=logfile) 
     fh.setFormatter(formatted_file) 
     fh.addFilter(ContextFilter(self.jobdata.jobid)) 
     logger.addHandler(fh) 
     ch = logging.StreamHandler(sys.stdout) 
     ch.setFormatter(formated) 
     ch.addFilter(ContextFilter(self.jobdata.jobid)) 
     logger.addHandler(ch) 
     return logger 
    else: 
     fh = logging.FileHandler(filename=logfile) 
     fh.setFormatter(formatted_file) 
     fh.addFilter(ContextFilter(self.jobdata.jobid)) 
     self.log.addHandler(fh) 
     return fh