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')
错误原因与排查线索
logging.basicConfig仅首次调用生效
Python的logging.basicConfig是惰性初始化逻辑,只有在日志系统未被初始化时才会生效。如果主脚本或其他导入的模块在调用ms_logging.logging()之前,已经通过logging.debug()/logging.info()等方法触发了日志系统初始化,后续的basicConfig调用会被直接忽略,导致你的文件输出配置不生效。文件路径或权限问题
- 检查
/home/etl_developer/ms_de/log_directory/目录是否存在,若不存在则无法创建日志文件。 - 确认运行脚本的用户对该目录有写入权限,若权限不足,日志文件无法生成。
日志级别冲突
虽然代码中设置了level=logging.DEBUG,但如果根日志器在之前已被设置为更高级别(如logging.WARNING),则info、debug级别的日志会被过滤。不过error级别日志仍应输出,可优先排查此点排除级别问题。重复初始化导致的配置失效
每次调用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')
快速排查步骤
手动验证目录权限:
ls -ld /home/etl_developer/ms_de/log_directory/ touch /home/etl_developer/ms_de/log_directory/test.log若
touch命令失败,说明权限或目录存在问题。检查日志系统是否已提前初始化:
在主脚本开头添加:import logging print("Root logger handlers:", logging.getLogger().handlers) print("Root logger level:", logging.getLogger().level)若
handlers不为空,说明日志系统已被提前初始化。
内容的提问来源于stack exchange,提问作者Milon Sarker
相关产品推荐
相关产品推荐

