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

Python logger不写入日志文件:log方法执行成功无文件输出

Python Logger日志不写入文件排查与解决

核心问题根因

Python的logging.basicConfig仅在第一次调用时生效,你将该配置放在每次打印日志都会执行的Log方法内,首次调用后后续的配置都会静默失效,这是最常见的触发原因,其余问题可按照以下方向排查:

排查方向

  • 验证日志目录存在性:你当前的basicConfig没有提前创建日志目录,如果logs或server/logs目录不存在,basicConfig会抛出异常,你使用了空except捕获所有异常,会静默吞掉目录不存在、权限不足等报错,导致配置不生效
  • 验证环境判断逻辑:添加打印确认settings.SERVER_ENVIRONMENT确实等于-local,否则写文件的代码分支不会执行
  • 验证日志级别匹配:确认转换后的iv_level(如DEBUG/INFO等)等级大于等于你设置的lv_log_level,低等级日志会被直接过滤
  • 验证logger传播属性:确认你获取的logging.getLogger(iv_domain)实例没有被其他代码设置过propagate = False,该属性为False时日志不会传递到root logger的文件处理器,自然不会写入文件
  • 验证编码兼容性:Windows系统下默认文件编码不是UTF-8,就算你替换了emoji,也可能因为存在其他特殊字符导致写入失败且无报错

解决方案

  1. 将日志初始化逻辑移到程序启动入口,仅执行一次,提前创建日志目录并显式指定编码:
# 程序启动时仅执行一次,不要放在Log方法内
import os
import logging

# 优先选logs目录,不存在则用server/logs
if os.path.isdir("logs"):
    log_path = "logs/logs.log"
else:
    log_path = "server/logs/logs.log"
# 自动创建不存在的目录,避免路径不存在报错
os.makedirs(os.path.dirname(log_path), exist_ok=True)

logging.basicConfig(
    filename=log_path,
    level=Logger.LOG_LEVEL,
    format='%(asctime)s | %(levelname)s | %(message)s',
    encoding="utf-8" # 显式指定编码兼容多系统
)
  1. 移除空except捕获,避免吞掉报错:如果需要保留双路径兼容,捕获异常时要打印错误信息方便定位
try:
    # 主路径配置
except Exception as e:
    print(f"主日志路径配置失败:{str(e)},尝试备用路径")
    # 备用路径配置
  1. 若仍存在问题,可给指定domain的logger显式绑定文件处理器,避免依赖root logger的配置:
# 初始化阶段全局创建一次文件处理器
file_handler = logging.FileHandler(log_path, encoding="utf-8")
file_handler.setFormatter(logging.Formatter('%(asctime)s | %(levelname)s | %(message)s'))

# 在Log方法内获取logger后绑定处理器
lo_logger = logging.getLogger(iv_domain)
lo_logger.addHandler(file_handler)
lo_logger.setLevel(Logger.LOG_LEVEL)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:36:05