Python自定义logger配置异常:无输出、跨脚本调用失败
核心问题
你现有代码存在几处逻辑错误,直接导致日志功能失效:
- 函数定义不符合预期:
PrintLog函数冗余声明了self参数(既非类方法也无实例绑定需求),没有设计参数接收待打印的日志内容,函数内部创建完logger与处理器后既不返回logger实例,也不触发日志输出动作,最终表现为生成空日志文件、控制台无任何输出。 - 命名冲突:函数内部将logger实例命名为与函数同名的
PrintLog,外部导入的PrintLog是函数对象,自然不存在.debug等logger实例专属方法。 - 路径逻辑缺失:未实现
OutputLogs目录的自动创建逻辑,也未将日志文件生成路径指向该目录,不符合统一存储要求。 - 未做重复初始化防护:若多次执行初始化逻辑会重复添加处理器,导致同一条日志重复输出多次。
修正实现
直接将PrintLog.py改为全局单例日志模块,一次初始化即可在所有脚本中调用,无需重复配置。
PrintLog.py 完整代码
import os import logging from datetime import datetime # 自动创建日志存储根目录 LOG_DIR = "OutputLogs" os.makedirs(LOG_DIR, exist_ok=True) def _gen_timestamp_filename(fname, fmt='%Y-%m-%d_%H.%M.%S - {fname}'): return datetime.now().strftime(fmt).format(fname=fname) # 初始化全局唯一logger实例 logger = logging.getLogger("ATS_GLOBAL_LOG") logger.setLevel(logging.DEBUG) # 防止重复添加处理器导致日志重复 if not logger.handlers: log_formatter = logging.Formatter('%(levelname)s:%(name)s:%(message)s:%(asctime)s') # 配置文件输出处理器 log_file_path = os.path.join(LOG_DIR, _gen_timestamp_filename('Test Report.txt')) file_handler = logging.FileHandler(log_file_path, encoding='utf-8') file_handler.setLevel(logging.DEBUG) file_handler.setFormatter(log_formatter) # 配置控制台输出处理器 console_handler = logging.StreamHandler() console_handler.setLevel(logging.DEBUG) console_handler.setFormatter(log_formatter) logger.addHandler(file_handler) logger.addHandler(console_handler) # 暴露各日志级别调用方法,与原生logging用法完全一致 debug = logger.debug info = logger.info warning = logger.warning error = logger.error critical = logger.critical
跨脚本调用方式
其他业务脚本无需编写任何日志配置代码,直接导入即可使用:
from sys import platform # 可直接导入对应级别的日志方法,也可以导入模块后通过PrintLog.info()形式调用 from PrintLog import info if platform == "darwin": info('Operating System = MAC') elif platform == "win32": info('Operating System = Windows') # 其他级别日志调用示例 # debug("调试级别的日志内容") # warning("警告级别的日志内容") # error("错误级别的日志内容")
实现效果
- 首次导入日志模块时自动完成所有初始化,自动创建
OutputLogs目录,生成带精确到秒时间戳的日志文件,所有日志同时写入文件与输出到控制台,不会出现空文件问题。 - 完全兼容原生logging的调用习惯,直接调用
debug/info/warning/error方法即可,不会出现属性不存在的报错。 - 全局仅初始化一次,所有业务脚本共用同一套日志配置,无需重复编写配置逻辑,所有日志文件统一存入
OutputLogs目录。
内容的提问来源于stack exchange,提问作者Chris Trace
相关产品推荐
相关产品推荐

