【需求要点】
当前程序已经实现日志记录到 log 文件。新增需求,需要把日志记录到文件的同时,通过 syslog 服务记录到系统日志中。
要求通过新增参数的方式实现日志记录扩展,不能影响原有日志记录。
如果在某一条日志记录处增加参数,则把该日志记录到日志文件和系统日志两个位置中。
【实现方案】
方便调试起见,暂不考虑如何通过 syslog 服务记录到系统日志中,而是直接输出到控制台。demo 程序如下:
#!/bin/python# -*- encoding:utf-8 -*-import sysimport loggingclass ContextFilter(logging.Filter): """ 这是一个控制日志记录的过滤器。 """ def filter(self, record): try: filter_key = record.TASK except AttributeError: return False if filter_key == "logToConsole": return True else: return Falseif __name__ == '__main__': # 创建日志对象 logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 创建日志处理器,记录日志到文件 log_path = "./log.log" file_handler = logging.FileHandler(log_path) file_handler.setLevel(logging.INFO) file_fmt = "%(asctime)-15s %(levelname)s [%(filename)s %(lineno)d] %(message)s" file_formatter = logging.Formatter(file_fmt) file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) # 添加日志处理器,输出日志到控制台 console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.WARN) console_fmt = '%(asctime)-15s [%(TASK)s] %(message)s' console_formatter = logging.Formatter(console_fmt) console_handler.setFormatter(console_formatter) console_filter = ContextFilter() console_handler.addFilter(console_filter) logger.addHandler(console_handler) filter_dict = { 'TASK': 'logToConsole'} # 记录日志 logger.debug('debug message') logger.info('info message') logger.warning('warn message') logger.error('error message1', extra=filter_dict) logger.error('error message2')
【参考资料】
通过 syslog 服务记录到系统日志中,参考资料: