如何在Python的logging.ini中设置绝对路径?解决跨脚本日志路径异常
解决Python日志模块跨脚本路径错误问题
问题背景
项目文件结构:
project │ README.md │ requirements.txt │ main.py │ logging.ini │ └───log │ clear_log.py │ file.log
logging.ini中fileHandler配置:
[handler_fileHandler] class=FileHandler level=INFO formatter=simpleFormatter args=("log/file.log",)
main.py和clear_log.py中均使用以下代码初始化日志:
import logging.config logging.config.fileConfig("logging.ini", disable_existing_loggers=False) logger = logging.getLogger(__name__) logger.info("log something.")
运行main.py时日志正常输出,但运行clear_log.py时出现FileNotFoundError,核心原因是:FileHandler的相对路径基于进程当前工作目录解析,而非脚本所在目录。若直接在log目录下运行clear_log.py,工作目录为log,此时"log/file.log"会被解析为log/log/file.log,该路径不存在。
解决方案
方案1:统一从项目根目录运行脚本
无论运行哪个脚本,都切换到项目根目录执行:
- 运行main.py:
python main.py - 运行clear_log.py:
python log/clear_log.py
此方式保证工作目录始终为项目根,相对路径解析一致,无需修改代码或配置。
方案2:脚本内强制切换到项目根目录
在每个脚本开头添加代码,将工作目录切换至项目根,确保相对路径解析正确:
import os from pathlib import Path import logging.config # 确定项目根目录 if __name__ == "__main__": # 当前脚本是main.py,根目录为脚本所在目录 project_root = Path(__file__).parent else: # 当前脚本是clear_log.py,根目录为父级目录 project_root = Path(__file__).parent.parent # 切换工作目录到项目根 os.chdir(project_root) # 加载日志配置 logging.config.fileConfig("logging.ini", disable_existing_loggers=False) logger = logging.getLogger(__name__) logger.info("log something.")
方案3:使用绝对路径
3.1 硬编码绝对路径(不推荐)
直接在logging.ini中写死日志文件的绝对路径:
[handler_fileHandler] class=FileHandler level=INFO formatter=simpleFormatter args=("/home/user/project/log/file.log",)
缺点是移植性差,部署路径变更时需手动修改配置。
3.2 动态生成绝对路径(推荐)
先修改logging.ini,用占位符标记日志路径:
[handler_fileHandler] class=FileHandler level=INFO formatter=simpleFormatter args=("${LOG_FILE_PATH}",)
再在脚本中动态生成绝对路径并替换占位符后加载配置:
import os from pathlib import Path import logging.config import io # 生成日志文件绝对路径 if __name__ == "__main__": project_root = Path(__file__).parent else: project_root = Path(__file__).parent.parent log_file_path = str(project_root / "log" / "file.log") # 读取并替换配置内容 with open("logging.ini", "r") as f: config_content = f.read().replace("${LOG_FILE_PATH}", log_file_path) # 加载修改后的日志配置 logging.config.fileConfig(io.StringIO(config_content), disable_existing_loggers=False) logger = logging.getLogger(__name__) logger.info("log something.")
此方式兼顾灵活性与正确性,无需依赖特定运行方式,也避免硬编码路径。
内容的提问来源于stack exchange,提问作者Tung
相关产品推荐
相关产品推荐

