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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 11:30:56