logging模块、LaTeX与matplotlib间的字体警告冲突问题排查
Logging配置触发Matplotlib LaTeX字体警告的原因分析
问题复现
运行以下代码:
import logging import matplotlib.pyplot as plt import matplotlib.pyplot as mpl mpl.rc('font', family='serif', serif="DejaVu Serif") mpl.rc('text', usetex=True) # Set up logging module level = logging.INFO frmt = '%(message)s' handlers = [ logging.FileHandler("test.log", mode='a'), logging.StreamHandler()] logging.basicConfig(level=level, format=frmt, handlers=handlers) fig = plt.figure() plt.scatter(.5, .5) plt.xlabel("test label") plt.savefig("del.png")
会反复输出警告:
No LaTeX-compatible font found for the serif fontfamily in rcParams. Using default.
但注释掉serif="DejaVu Serif",或者保留该参数但删除logging配置代码,警告就会消失,且输出图像无差异。
核心原因
这既不是logging与系统字体的冲突,也不是logging和LaTeX的直接问题,本质是logging配置覆盖了Matplotlib默认的警告过滤规则:
- 当启用
usetex=True时,Matplotlib会检查自定义字体是否兼容LaTeX,但DejaVu Serif本身是支持LaTeX的(你已安装必要依赖),所以这是一个误触发的低级别警告。 - 默认情况下,Matplotlib会把这类警告的日志级别设为INFO,而Python默认的日志配置会过滤INFO级别的非核心日志,所以你看不到警告。
- 当你手动调用
logging.basicConfig并设置level=logging.INFO时,会全局开启INFO级别的日志输出,包括Matplotlib的这类误触发警告,导致大量输出。
验证逻辑
- 注释
serif="DejaVu Serif":Matplotlib直接使用LaTeX默认衬线字体,跳过自定义字体检查,自然没有警告。 - 注释logging配置:Python默认日志过滤生效,Matplotlib的INFO级警告被隐藏。
解决方法
不需要修改字体配置,只需调整日志级别即可:
- 把logging的级别从
INFO改为WARNING,这样只会输出更严重的日志:level = logging.WARNING - 或者单独降低Matplotlib的日志级别,不影响其他模块的日志输出:
logging.basicConfig(level=level, format=frmt, handlers=handlers) # 新增这一行 logging.getLogger('matplotlib').setLevel(logging.WARNING)
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

