以python日志记录格式插入变量的正确方法

时间:2017-07-24 18:53:16

标签: python python-2.7 logging

无法让这个工作。可能缺乏对python日志记录模块的理解。

用例 - 在所有日志消息上打印一个变量。即“jobID”。当此实用程​​序的多个实例将在同一服务器中并行运行时 - 可以根据此jobID实时解析syslog或../log/messages。这是使用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

面临过滤器的问题是来自其他模块的'keyerror'(paramiko - transport.py)。与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

1 个答案:

答案 0 :(得分: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
相关问题