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,也可能因为存在其他特殊字符导致写入失败且无报错
解决方案
- 将日志初始化逻辑移到程序启动入口,仅执行一次,提前创建日志目录并显式指定编码:
# 程序启动时仅执行一次,不要放在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" # 显式指定编码兼容多系统 )
- 移除空
except捕获,避免吞掉报错:如果需要保留双路径兼容,捕获异常时要打印错误信息方便定位
try: # 主路径配置 except Exception as e: print(f"主日志路径配置失败:{str(e)},尝试备用路径") # 备用路径配置
- 若仍存在问题,可给指定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
相关产品推荐
相关产品推荐

