Python多文件调用自定义Logger无输出问题及可行实现方案咨询
日志初始化问题排查与修复方案
原代码的错误点
setFormatter参数类型错误:handler.setFormatter(Log_Format)直接传入了字符串格式模板,但setFormatter要求必须传入logging.Formatter实例,这会导致日志处理逻辑直接失效。get_log_filename未定义:代码中调用了该函数但未实现,会直接抛出NameError,导致logger初始化失败。- 缺少控制台输出逻辑:原代码仅配置了文件输出的
FileHandler,默认不会在控制台打印日志;如果需要控制台输出,需额外添加StreamHandler。
修复后的logger.py代码
import logging # 先实现日志文件名生成函数,示例返回固定文件名,可根据需求修改 def get_log_filename(): return "app.log" Log_Format = "%(levelname)s %(asctime)s - %(message)s" log_file = get_log_filename() def setup_logger(name, log_file, level=logging.INFO): # 文件日志处理器 file_handler = logging.FileHandler(log_file, mode="a") # 修正:传入Formatter实例而非字符串 file_handler.setFormatter(logging.Formatter(Log_Format)) file_handler.setLevel(level) # 控制台日志处理器(可选,不需要可删除) console_handler = logging.StreamHandler() console_handler.setFormatter(logging.Formatter(Log_Format)) console_handler.setLevel(level) logger = logging.getLogger(name) logger.setLevel(level) # 避免重复添加处理器(多次调用setup_logger时生效) if not logger.handlers: logger.addHandler(file_handler) logger.addHandler(console_handler) return logger logger = setup_logger("Logger", log_file)
修复后,原有调用方式无需修改:在file1.py、main_file.py等文件中依然可以用from logger import logger来调用日志方法。
关于第一种初始化方式的可行性
完全可以用第一种模块化的logger.py方式实现,只要修正上述错误即可。这种方式比在主文件中直接用logging.basicConfig更便于复用,所有业务文件能统一导入同一个预配置好的logger实例,维护性更强。
内容的提问来源于stack exchange,提问作者Lax_Sam
相关产品推荐
相关产品推荐

