You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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级警告被隐藏。

解决方法

不需要修改字体配置,只需调整日志级别即可:

  1. 把logging的级别从INFO改为WARNING,这样只会输出更严重的日志:
    level = logging.WARNING
    
  2. 或者单独降低Matplotlib的日志级别,不影响其他模块的日志输出:
    logging.basicConfig(level=level, format=frmt, handlers=handlers)
    # 新增这一行
    logging.getLogger('matplotlib').setLevel(logging.WARNING)
    

内容的提问来源于stack exchange,提问作者Gabriel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:30:09