我有同样的要求,就这样做了,享受吧!
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)
主文件
if __name__ == "__main__":
my_warnings.set_deprecation_warnings()
#... your code