使用结构日志包装"py.warnings"记录器以添加处理器



我有一个自定义记录器,包括处理器、处理程序等;py警告";据我所知,记录器被警告使用,因此我的处理器被"注入"。但是,运行以下代码不会对打印到控制台的警告进行任何更改。


import logging
import structlog
import warnings
structlog.wrap_logger(
logging.getLogger("py.warnings"),
# processors etc. ...
)
warnings.warn("abc")

这样是行不通的。structlog.wrap_logger()是专门制作的,因此它没有副作用,并且必须使用它的返回值进行日志记录,才能使用structlog。

您必须将日志记录配置为使用structlog,此处对此进行了说明。简而言之,structlog附带了一个日志样式的格式化程序,允许您使用structlog通过专用的处理器链格式化所有日志条目。

我也有同样的请求,并以这种方式提出了,享受吧!

my_warnings.py

import logging
import warnings
from typing import Final, Union, Type
import structlog
from structlog.stdlib import _SENTINEL
WARNINGS_LOGGER_NAME: Final = "py.warnings"
FORMATTER: Final = structlog.stdlib.ProcessorFormatter(processor=YourProcessor(), foreign_pre_chain=[your_chain...])
FORMATTER.logger = logging.getLogger(WARNINGS_LOGGER_NAME)
old_format_warning = warnings.formatwarning

class MyPendingDeprecationWarning(UserWarning):
pass

MY_WARNING_CATEGORIES = [MyPendingDeprecationWarning]

def _format_warnings(message, category, filename, lineno, line=None):
if category not in MY_WARNING_CATEGORIES:
return old_format_warning(message, category, filename, lineno, line)
new_message = f"{category.__name__}: {message}"
record = logging.LogRecord(
FORMATTER.logger.name,
pathname=filename,
lineno=lineno,
msg=new_message,
args=(),
exc_info=(category, category(), None),
level=logging.WARNING,
)
record._logger = _SENTINEL
record._name = _SENTINEL
return FORMATTER.format(record)

def set_deprecation_warnings():
warnings.formatwarning = _format_warnings
logging.captureWarnings(True)

主.py

if __name__ == "__main__":
my_warnings.set_deprecation_warnings()
#... your code

最新更新