如何在Python Logger格式化中条件性覆盖levelname以匹配NLog?
解决Python日志与NLog格式对齐及级别名称匹配问题
可以通过两种方式实现日志级别名称的替换和对齐,完美匹配NLog的格式:
方法一:自定义过滤器添加NLog风格级别字段
创建一个日志过滤器,给日志记录添加转换后的NLog级别字段,再在格式中使用该字段:
import logging class NLogLevelFilter(logging.Filter): # 定义Python到NLog的级别映射 LEVEL_MAP = { 'WARNING': 'WARN', 'CRITICAL': 'FATAL', 'DEBUG': 'DEBUG', 'INFO': 'INFO', 'ERROR': 'ERROR' } def filter(self, record): # 给日志记录添加自定义的NLog级别字段 record.nlog_level = self.LEVEL_MAP.get(record.levelname, record.levelname) return True # 配置日志 formatter = logging.Formatter( format='%(asctime)s.%(msecs)04d - %(nlog_level)5s - %(module)s, Line %(lineno)d - %(message)s\n', datefmt='%Y-%m-%d %H:%M:%S' ) handler = logging.FileHandler('your_shared_log.log') # 添加自定义过滤器 handler.addFilter(NLogLevelFilter()) handler.setFormatter(formatter) logger = logging.getLogger(__name__) logger.addHandler(handler) logger.setLevel(logging.DEBUG)
方法二:重写日志格式化器直接替换级别名称
继承默认的Formatter,在格式化流程中直接替换级别名称:
import logging class NLogFormatter(logging.Formatter): # 用日志级别编号映射,避免字符串匹配的潜在问题 LEVEL_MAP = { logging.WARNING: 'WARN', logging.CRITICAL: 'FATAL', logging.DEBUG: 'DEBUG', logging.INFO: 'INFO', logging.ERROR: 'ERROR' } def format(self, record): # 替换原级别名称为NLog风格 record.levelname = self.LEVEL_MAP.get(record.levelno, record.levelname) return super().format(record) # 配置日志 formatter = NLogFormatter( format='%(asctime)s.%(msecs)04d - %(levelname)5s - %(module)s, Line %(lineno)d - %(message)s\n', datefmt='%Y-%m-%d %H:%M:%S' ) handler = logging.FileHandler('your_shared_log.log') handler.setFormatter(formatter) logger = logging.getLogger(__name__) logger.addHandler(handler) logger.setLevel(logging.DEBUG)
两种方法都能实现:
- 将Python的
WARNING转为NLog的WARN,CRITICAL转为FATAL - 级别名称按5字符宽度右对齐,和NLog日志完美对齐
内容的提问来源于stack exchange,提问作者ysi_d
相关产品推荐
相关产品推荐

