Min*_*ngo 5 python logging python-3.x
所以我可以像这样向我的日志消息添加其他字段
logging.info("My log Message", extra={"someContext":1, "someOtherContext":2})
Run Code Online (Sandbox Code Playgroud)
这很好
但不清楚如何提取日志格式化程序中的所有额外字段
def format(self, record):
record_dict = record.__dict__.copy()
print(record_dict)
Run Code Online (Sandbox Code Playgroud)
在上面我可以看到输出字典中的所有额外字段,但它们被展平为一个字典,其中包含我不想要的其他垃圾负载
{'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}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以获取我所有的额外钥匙,而不必预先知道它们?
我正在编写一个 json 格式化程序并想创建一个 dict a la
justMyExtra = ?????
to_log = {
"message" record_dict["message"],
**justMyExtra
}
Run Code Online (Sandbox Code Playgroud)
如果您阅读该方法的源代码logging.Logger.makeRecord,该方法返回一个LogRecord具有给定日志信息的对象,您会发现它将字典extra与__dict__返回对象的属性合并,因此您无法在格式化程序中LogRecord检索原始字典。extra
相反,您可以logging.Logger.makeRecord使用包装函数来修补该方法,该函数将给定的extra字典存储为_extra返回LogRecord对象的属性:
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
Run Code Online (Sandbox Code Playgroud)
以便:
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'})
Run Code Online (Sandbox Code Playgroud)
输出:
Got extra: {'foo': 'bar'}
__main__ - WARNING - test - bar
Run Code Online (Sandbox Code Playgroud)
演示: https: //repl.it/@blhsing/WorthyTotalLivedistro
| 归档时间: |
|
| 查看次数: |
7306 次 |
| 最近记录: |