我从 logging.ini
文件中进行了基本设置,以便我的控制台打印人类可读的日志,但我将类似 JSON dict 的日志打印到文件中,因此我的 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'}
关于python - 在 python 中登录到控制台时显示额外的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56559971/