Python中logger模块日志无法写入指定文件问题问询
我来帮你解决这个日志配置的问题——这是多模块Python项目里很常见的坑,咱们一步步拆解:
问题根源
你现在的问题主要出在两个地方:
日志配置时机太晚:你把
logging.basicConfig放在了if __name__ == '__main__':代码块里,但你的主文件大概率是先导入了其他包含日志调用的模块,之后才执行这个配置。当其他模块被导入时,Python会自动给logging设置默认配置(级别是WARNING,输出到控制台),这时候根logger已经有了handler,后续再调用basicConfig就不会生效了——因为这个方法只在根logger没有任何handler的时候才会创建新配置。默认级别过滤了info日志:logging默认只记录
WARNING及以上级别的日志,所以你的logging.info()语句直接被过滤掉了,只有错误、警告这类高优先级日志能被看到。
具体解决方案
方案一:提前配置日志(最简单有效)
把日志配置代码移到主文件的最顶部,在导入其他模块之前就执行,这样其他模块导入时,logging已经是你想要的配置了:
import logging # 先搞定日志配置 LOG_FILENAME = '/home/akash/exdion-pdf-extracter/doc/epod.log' logging.basicConfig( filename=LOG_FILENAME, level=logging.DEBUG, ) # 再导入其他业务模块 from your_module import YourClass if __name__ == '__main__': # 这里开始跑你的主逻辑 YourClass.initiate_pdf_processing(...)
方案二:强制重置logger(如果没法提前导入模块)
如果因为项目结构原因没法提前导入模块,你可以手动清除根logger的现有handler,再重新配置:
import logging if __name__ == '__main__': LOG_FILENAME = '/home/akash/exdion-pdf-extracter/doc/epod.log' # 先清空根logger的所有handler,确保basicConfig能生效 for handler in logging.root.handlers[:]: logging.root.removeHandler(handler) # 重新配置日志 logging.basicConfig( filename=LOG_FILENAME, level=logging.DEBUG, ) # 现在再导入模块并执行逻辑 from your_module import YourClass YourClass.initiate_pdf_processing(...)
方案三:独立日志配置模块(推荐给大型项目)
如果你的项目模块比较多,最好把日志配置单独做成一个模块,这样所有模块都用同一个配置,避免重复代码:
创建logger_config.py文件
import logging import os LOG_FILENAME = '/home/akash/exdion-pdf-extracter/doc/epod.log' # 确保日志目录存在,避免报错 os.makedirs(os.path.dirname(LOG_FILENAME), exist_ok=True) # 配置日志,还可以加个详细的格式 logging.basicConfig( filename=LOG_FILENAME, level=logging.DEBUG, format='%(asctime)s - %(module)s - %(levelname)s: %(message)s' ) # 导出logger实例,其他模块直接用这个 logger = logging.getLogger(__name__)
然后在业务模块里用这个logger:
from logger_config import logger @staticmethod def initiate_pdf_processing(ct_doc, pt_doc, feature, startAndEndKeyList): logger.info("testing logger") ...
主文件里只需要先导入配置模块就行:
import logger_config from your_module import YourClass if __name__ == '__main__': YourClass.initiate_pdf_processing(...)
验证方式
配置完之后,在主逻辑开头加一行测试日志:
logging.debug("Logger setup completed")
运行程序后去日志文件里看,如果能看到这条debug日志,说明配置没问题,其他模块的info日志也会正常写入了。
内容的提问来源于stack exchange,提问作者Akash Kumar

