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

Python自定义日志模块无法正常工作问题排查

日志模块未生效问题排查与解决

问题描述

开发了统一日志模块ms_logging.py,代码如下:

import logging

class ms_logging:
        @staticmethod
        def logging():
            logging.basicConfig(
                level=logging.DEBUG,
                format='%(asctime)s | %(levelname)s | [%(filename)s:%(lineno)d] | %(message)s',
                datefmt="%Y-%m-%d %H:%M:%S",
                filename="/home/etl_developer/ms_de/log_directory/master_log_file.log"
                )
            logger = logging.getLogger()
            return logger

在其他脚本中调用该模块写入日志,代码无报错但日志文件为空:

import sys
sys.path.append('/home/etl_developer/ms_de/module_library/')
from ms_logging import ms_logging

log = ms_logging.logging()
log.error('test')
log.info('hello there')

错误原因与排查线索

  1. logging.basicConfig仅首次调用生效
    Python的logging.basicConfig是惰性初始化逻辑,只有在日志系统未被初始化时才会生效。如果主脚本或其他导入的模块在调用ms_logging.logging()之前,已经通过logging.debug()/logging.info()等方法触发了日志系统初始化,后续的basicConfig调用会被直接忽略,导致你的文件输出配置不生效。

  2. 文件路径或权限问题

  • 检查/home/etl_developer/ms_de/log_directory/目录是否存在,若不存在则无法创建日志文件。
  • 确认运行脚本的用户对该目录有写入权限,若权限不足,日志文件无法生成。
  1. 日志级别冲突
    虽然代码中设置了level=logging.DEBUG,但如果根日志器在之前已被设置为更高级别(如logging.WARNING),则info、debug级别的日志会被过滤。不过error级别日志仍应输出,可优先排查此点排除级别问题。

  2. 重复初始化导致的配置失效
    每次调用ms_logging.logging()都会尝试执行basicConfig,但如第一条所述,仅第一次调用有效,后续返回的日志器可能未应用你的配置。

修正方案

方案1:模块级别初始化日志(推荐)

将日志初始化逻辑放在模块顶层,确保仅执行一次:

# ms_logging.py
import logging

# 模块导入时完成日志配置,确保全局唯一初始化
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s | %(levelname)s | [%(filename)s:%(lineno)d] | %(message)s',
    datefmt="%Y-%m-%d %H:%M:%S",
    filename="/home/etl_developer/ms_de/log_directory/master_log_file.log"
)
_global_logger = logging.getLogger()

class ms_logging:
    @staticmethod
    def get_logger():
        return _global_logger

调用脚本修改为:

import sys
sys.path.append('/home/etl_developer/ms_de/module_library/')
from ms_logging import ms_logging

log = ms_logging.get_logger()
log.error('test')
log.info('hello there')

方案2:直接导出日志实例

简化模块结构,无需类封装:

# ms_logging.py
import logging

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s | %(levelname)s | [%(filename)s:%(lineno)d] | %(message)s',
    datefmt="%Y-%m-%d %H:%M:%S",
    filename="/home/etl_developer/ms_de/log_directory/master_log_file.log"
)
logger = logging.getLogger(__name__)

调用脚本:

import sys
sys.path.append('/home/etl_developer/ms_de/module_library/')
from ms_logging import logger

logger.error('test')
logger.info('hello there')

快速排查步骤

  1. 手动验证目录权限:

    ls -ld /home/etl_developer/ms_de/log_directory/
    touch /home/etl_developer/ms_de/log_directory/test.log
    

    若touch命令失败,说明权限或目录存在问题。

  2. 检查日志系统是否已提前初始化:
    在主脚本开头添加:

    import logging
    print("Root logger handlers:", logging.getLogger().handlers)
    print("Root logger level:", logging.getLogger().level)
    

    若handlers不为空,说明日志系统已被提前初始化。

内容的提问来源于stack exchange,提问作者Milon Sarker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:15:39