如何防止日志传播到其他模块?



我在我的python脚本(myscript.py)中创建了一个日志记录器,

logfmt = '[%(asctime)s]{%(filename)s:%(lineno)d}[%(levelname)s] %(message)s'
datefmt = '%Y-%m-%dT%H:%M:%S'
formatter = logging.Formatter(logfmt, datefmt=datefmt)
logging.basicConfig(level=logging.DEBUG, format=logfmt, datefmt=datefmt)
logger = logging.getLogger(name='mine')

在INFO级别,它看起来不错。但是在DEBUG级别,奇怪的是matplotlib打印的日志显示了它导入的模块的一个很长的列表。如何防止它,只打印我的脚本日志?

[2021-07-27T11:53:48]{myscript.py:183}[INFO] ...
[2021-07-27T11:53:48]{__init__.py:224}[DEBUG] matplotlib data path: /home/user/anaconda3/lib/python3.8/site-packages/matplotlib/mpl-data
[2021-07-27T11:53:48]{__init__.py:224}[DEBUG] CONFIGDIR=/home/user/.config/matplotlib
[2021-07-27T11:53:48]{__init__.py:1394}[DEBUG] matplotlib version 3.4.2
[2021-07-27T11:53:48]{__init__.py:1395}[DEBUG] interactive is False
[2021-07-27T11:53:48]{__init__.py:1396}[DEBUG] platform is linux
[2021-07-27T11:53:48]{__init__.py:1397}[DEBUG] loaded modules: ['sys', 'builtins', '_frozen_importlib', '_imp', '_warnings', '_frozen_importlib_external', '_io', 'marshal', 'posix', '_thread', '_weakref', 'time', 'zipimport', '_codecs', 'codecs', 'encodings.aliases', 'encodings', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', '_abc', 'abc', 'io', '_stat', 'stat', '_collections_abc', 
... very only list ...
'cycler', 'matplotlib.rcsetup', 'matplotlib._version', 'matplotlib.ft2font', 'kiwisolver', 'dateutil.rrule', 'matplotlib.units', 'matplotlib.dates']
[2021-07-27T11:53:48]{myscript.py:351}[INFO] ...

获取matplotlib使用的日志记录器,然后覆盖其日志级别:

logging.getLogger(name='matplotlib').setLevel(logging.WARNING)

查看如何使用python列出所有现有的日志记录器。如果你想知道我是如何找到matplotlib记录器的名称的(它恰好与模块和包的名称相同,但它不必是)。

没有设置来尝试这个,希望仍然有效。在你的日志配置后添加:

mpl_logger = logging.getLogger(‘matplotlib’)
mpl_logger.setLevel(logging.WARNING) 

将matplotlib的日志级别设置为"info"看到https://matplotlib.org/stable/_modules/matplotlib.html set_loglevel

最新更新