Python日志系统核心是Logger、Handler、Formatter和Filter四大组件协同:Logger决定“记什么”和“往哪送”,Handler负责“怎么发”和“发给谁”,Formatter定义输出格式,Filter实现精细过滤。
Python日志系统的核心在于理解 logging 模块的四大组件如何协同工作:Logger(记录器)、Handler(处理器)、Formatter(格式器)和 Filter(过滤器)。不搞懂它们之间的关系,配置再复杂也容易出错。
每个 Logger 都有日志级别(DEBUG、INFO、WARNING、ERROR、CRITICAL),只有 >= 当前级别的日志才会被处理。Logger 本身不输出日志,而是把日志对象(LogRecord)交给它绑定的 Handler。注意:Logger 可以有多个 Handler,也可以不输出(比如只做转发);子 Logger 默认会向父 Logger 传递日志(propagate=True),这是实现分级控制的关键。
logging.getLogger("a.b.c") 获取命名 Logger,推荐按模块名组织,便于统一管理logging.basicConfig(),它只影响 root Logger,掩盖了层级逻辑logger.setLevel(logging.DEBUG) 控制本级过滤,但不阻止父级再次过滤Handler 负责实际的输出动作。常见类型有 StreamHandler(打印到终端)、FileHandler(写入文件)、RotatingFileHandler(自动轮转)、TimedRotatingFileHandler(按时间切分)等。每个 Handler 也可设级别,形成二次过滤。
logging.Handler,重写 emit() 方法即可接入 Kafka、ES 或钉钉通知Formatter 定义日志字符串的结构,支持 %(asctime)s、%(name)s、%(levelname)s、%(message)s 等占位符;Filter 则是更精细的拦截逻辑,可基于 logger 名、消息内容、甚至自定义条件返回 True/False。
%(pathname)s:%(lineno)d,方便定位问题代码行假设项目结构为 app/ 下有 main.py 和 utils/db.py,要求:
• INFO 及以上写入 daily.log(按天轮转)
• ERRO
R 及以上同时发邮件(模拟)
• db 模块单独 DEBUG 日志输出到 db_debug.log
db_logger = logging.getLogger("app.utils.db"),设 level=DEBUGemit(),调用 smtplib 发送摘要(注意异常捕获,避免日志系统崩溃)