在日志窗体中提取日志调用中的额外字段

2024-09-29 23:21:37 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我可以像这样在日志消息中添加其他字段

logging.info("My log Message", extra={"someContext":1, "someOtherContext":2})

这很好

但不清楚如何提取我的日志格式化程序中的所有额外字段

def format(self, record):
  record_dict = record.__dict__.copy()
  print(record_dict)

在上面我可以看到我在输出dict中的所有额外字段,但是它们被压平成一个dict,上面还有我不想要的垃圾

{'name': 'root', 'msg': 'My log Message', 'args': (), 'levelname': 'INFO', 'levelno': 20, 'pathname': '.\\handler.py', 'filename': 'handler.py', 'module': 'handler', 'exc_info': None, 'exc_text': None, 'stack_info': None, 'lineno': 27, 'funcName': 'getPlan', 'created': 1575461352.0664868, 'msecs': 66.48683547973633, 'relativeCreated': 1253.0038356781006, 'thread': 15096, 'threadName': 'MainThread', 'processName': 'MainProcess', 'process': 23740, 'someContext': 1, 'someOtherContext':2}

有没有办法不用事先知道就可以拿到我所有的备用钥匙

我正在编写一个json格式化程序,并希望创建一个dict a la

justMyExtra = ?????
to_log = {
"message" record_dict["message"], 
**justMyExtra
}

Tags: py程序infononelogmessagemyrecord
2条回答

如果您阅读^{}方法的源代码,该方法返回一个带有给定日志信息的LogRecord对象,您会发现它将extradict与returing LogRecord对象的__dict__属性合并,因此您无法在格式化程序中检索原始的extradict。你知道吗

相反,您可以使用包装函数修补logging.Logger.makeRecord方法,该包装函数将给定的extradict存储为返回的LogRecord对象的_extra属性:

def make_record_with_extra(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None):
    record = original_makeRecord(self, name, level, fn, lno, msg, args, exc_info, func, extra, sinfo)
    record._extra = extra
    return record

original_makeRecord = logging.Logger.makeRecord
logging.Logger.makeRecord = make_record_with_extra

以便:

class myFormatter(logging.Formatter):
    def format(self, record):
        print('Got extra:', record._extra) # or do whatever you want with _extra
        return super().format(record)

logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
handler.setFormatter(myFormatter('%(name)s - %(levelname)s - %(message)s - %(foo)s'))
logger.addHandler(handler)
logger.warning('test', extra={'foo': 'bar'})

输出:

Got extra: {'foo': 'bar'}
__main__ - WARNING - test - bar

演示:https://repl.it/@blhsing/WorthyTotalLivedistro

想到两种方法:

  1. 将所有额外字段转储到主词典中的词典中。调用键“additionalContext”并获取所有额外的条目。你知道吗
  2. 创建原始字典的副本并删除所有已知键:“name”、“msg”、“args”等,直到只有justyourpract

相关问题 更多 >

    热门问题