python - 在 python 中登录到控制台时显示额外的字段
问题描述
我有一个logging.ini
文件的基本设置,以便我的控制台打印人类可读的日志,但我将 JSON dict-like 日志打印到文件,所以我的 ELK 可以处理日志。
[formatter_json]
class=pythonjsonlogger.jsonlogger.JsonFormatter
format=%(asctime)s %(name)s %(levelname)s %(message)s
[formatter_simpleFormatter]
format=%(asctime)s %(name)s - %(levelname)s:%(message)s
记录消息时,我经常添加额外的字段,即席,如下所示:
logger.info("hello world, I like the word %s", "cowabanga", extra={"more":15})
因此该字段more:15
出现在我文件的日志行中。但它不会出现在控制台中,它只会说2019-06-12 13:25:02,189 root - INFO:hello world, I like the word cowabanga
. 我需要做什么才能拥有15
或more:15
出现(我不关心额外参数的出现顺序,只是它们出现)?
解决方案
该extra
参数只是被标准格式化程序忽略。
这意味着您将需要一个自定义Formatter
来很好地处理附加参数。例如,此类在 LogRecord 中查找额外的参数,如果有任何添加- extra {key: value, ...}
到消息中:
class ExFormatter(logging.Formatter):
def_keys = ['name', 'msg', 'args', 'levelname', 'levelno',
'pathname', 'filename', 'module', 'exc_info',
'exc_text', 'stack_info', 'lineno', 'funcName',
'created', 'msecs', 'relativeCreated', 'thread',
'threadName', 'processName', 'process', 'message']
def format(self, record):
string = super().format(record)
extra = {k: v for k,v in record.__dict__.items()
if k not in self.def_keys}
if len(extra)>0:
string += " - extra: " + str(extra)
return string
演示:
>>> log = logging.Logger('foo')
>>> hnd = logging.StreamHandler(sys.stdout)
>>> hnd.setFormatter(ExFormatter())
>>> log.addHandler(hnd)
>>> log.log(logging.INFO, 'foo', extra={'bar': 'baz'})
foo - extra: {'bar': 'baz'}
推荐阅读
- javascript - 你将如何创建这个函数并在数组中执行它?
- python - 用相对日期计数
- excel - 向下拖动时增加单元格引用
- c++ - 这个算法的时间复杂度写在下面
- javascript - 如何在打字稿中使用动态键键入函数返回类型?
- amazon-web-services - NGINX 反向代理 WSS 到 Amazon API 网关
- tensorflow - TensorFlow 2 中的梯度检查点
- java - android中的水平渐进式仪表
- javascript - addEventListener/querySelector/Toggle - 需要帮助更改颜色但取消选择其他选项卡
- javascript - 如何使用 javascript 在富文本编辑器上启用标题(h1、h2、h3、h4)?