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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:01:06