[英]Python add extra fields to structlog-based formatters within logging
I'm trying to add the extra fields of my logs as a key-value while keep using standard logging library along with structlog ProcessorFormatter.我正在尝试将日志的额外字段添加为键值,同时继续使用标准日志库和 structlog ProcessorFormatter。
Here is an example:这是一个例子:
If we use JsonFormatter, extra fields are added as a key-value to the log.如果我们使用 JsonFormatter,则会将额外的字段作为键值添加到日志中。
With python-json-logger:使用 python-json-logger:
formatter = jsonlogger.JsonFormatter()
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logging.basicConfig(
level=logging.DEBUG,
handlers=[handler]
)
logger = logging.getLogger('testnameloger1')
logger.debug('testmsg2', extra={'extra2': 2})
console:安慰:
{"message": "testmsg2", "extra2": 2}
With rendering using structlog-based formatters within logging:在日志记录中使用基于 structlog 的格式化程序进行渲染:
shared_processors = [
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.processors.TimeStamper(fmt='iso'),
]
formatter = structlog.stdlib.ProcessorFormatter(
processor=structlog.processors.JSONRenderer(),
foreign_pre_chain=shared_processors,
)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logging.basicConfig(
level=logging.DEBUG,
handlers=[handler]
)
logger = logging.getLogger('testnameloger1')
logger.debug('testmsg1', extra={'extra1': 1})
console:安慰:
{"event": "testmsg1", "logger": "testnameloger1", "level": "debug", "timestamp": "2020-06-16T13:33:50.881221Z"}
How can I add the extra fields in the log output?如何在日志 output 中添加额外的字段?
Logs I would want would be formatted like:我想要的日志格式如下:
{"event": "testmsg1", "extra1": 1, "logger": "testnameloger1", "level": "debug", "timestamp": "2020-06-16T13:33:50.881221Z"}
Thank you for your insight感谢您的见解
Here is an answer.这是一个答案。 Something else might work better.
别的东西可能会更好。
LOG_RECORD_ATTRIBUTES = {
'args', 'asctime', 'created', 'exc_info', 'exc_text', 'filename',
'funcName', 'levelname', 'levelno', 'lineno', 'message', 'module',
'msecs', 'msg', 'name', 'pathname', 'process', 'processName',
'relativeCreated', 'stack_info', 'thread', 'threadName',
}
def extract_stdlib_extra(logger, method_name, event_dict):
"""
Extract the `extra` key-values from the standard logger record
and populate the `event_dict` with them.
"""
record_extra = {k: v for k, v in vars(event_dict['_record']).items()
if k not in LOG_RECORD_ATTRIBUTES}
event_dict.update(record_extra)
return event_dict
processors = [
structlog.stdlib.add_logger_name,
structlog.stdlib.add_log_level,
structlog.processors.TimeStamper(fmt='iso'),
extract_stdlib_extra,
]
formatter = structlog.stdlib.ProcessorFormatter(
processor=structlog.processors.JSONRenderer(),
foreign_pre_chain=processors,
)
handler = logging.StreamHandler()
handler.setFormatter(formatter)
logging.basicConfig(
level=logging.DEBUG,
handlers=[handler]
)
logger = logging.getLogger('testnameloger1')
logger.debug('testmsg1', extra={'t': 1, 'z': {'r': 2}, 'k': []})
Console:安慰:
{"event": "testmsg1", "logger": "testnameloger1", "level": "debug", "timestamp": "2020-06-17T08:14:56.465786Z", "t": 1, "z": {"r": 2}, "k": []}
It's currently not possible out of the box, but there is a feature request on the bug tracker: https://github.com/hynek/structlog/issues/209目前不可能开箱即用,但错误跟踪器上有一个功能请求: https://github.com/hynek/structlog/issues/209
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.