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

Python脚本日志文件为空,无法记录数据库权限错误

问题分析与解决方案

1. 检查日志器级别配置

日志文件为空大概率和级别配置有关——控制台能输出INFO级别的连接日志,但ERROR级别的异常没写入,可能是文件Handler的级别没设对,或者根日志器级别过高。

确保你的setup_logger函数里:

  • 根日志器的级别设为logging.DEBUG或logging.INFO(足够低才能捕获ERROR)
  • 文件Handler单独设置级别,且不高于ERROR

示例修正代码:

import logging
from logging.handlers import RotatingFileHandler

def setup_logger():
    logger = logging.getLogger('db_operation_logger')
    # 根日志器级别必须足够低,否则会屏蔽下级Handler的日志
    logger.setLevel(logging.DEBUG)
    
    # 轮转文件Handler配置
    file_handler = RotatingFileHandler(
        'db_log.log', maxBytes=1024*1024, backupCount=5, encoding='utf-8'
    )
    file_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
    file_handler.setFormatter(file_formatter)
    # 明确设置文件Handler的级别,确保能捕获ERROR及以下日志
    file_handler.setLevel(logging.DEBUG)
    
    # 控制台Handler
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(file_formatter)
    console_handler.setLevel(logging.INFO)
    
    # 避免重复添加Handler
    if not logger.handlers:
        logger.addHandler(file_handler)
        logger.addHandler(console_handler)
    return logger

2. 修正异常捕获的日志调用

如果捕获异常后用print输出而不是日志器的方法,自然不会写入日志。另外,要用logger.exception()自动记录堆栈信息,比logger.error()更全面。

错误写法(仅输出到控制台):

try:
    conn = pymysql.connect(...)
except pymysql.err.OperationalError as e:
    print(f"权限不足:{e}")

正确写法(写入日志):

logger = setup_logger()

try:
    conn = pymysql.connect(host='xxx', user='xxx', password='xxx', db='xxx')
    logger.info("数据库连接成功")
    # 执行存储过程逻辑...
except pymysql.err.OperationalError as e:
    # exception方法会自动记录异常堆栈,便于排查
    logger.exception(f"数据库操作失败:权限不足或连接错误")
except Exception as e:
    # 兜底捕获其他异常
    logger.exception(f"未知错误:{str(e)}")

3. 排查日志文件的写入权限

日志文件创建后为空,可能是脚本对文件所在目录没有写入权限。可以:

  • 手动在目标目录创建一个测试文件,确认是否有权限
  • 修改日志文件路径到当前用户有权限的目录(比如./db_log.log改成/home/your_user/db_log.log)

4. 验证日志器初始化逻辑

如果脚本中多次调用setup_logger,会导致重复添加Handler,可能引发日志输出异常。在setup_logger里加判断,避免重复初始化(如上面示例中的if not logger.handlers:)。

5. 隔离测试日志功能

先脱离数据库逻辑,单独测试日志是否能正常写入,排除数据库代码的干扰:

logger = setup_logger()
try:
    # 手动触发一个异常
    raise PermissionError("测试权限不足异常")
except Exception as e:
    logger.exception("测试异常写入")

运行后查看日志文件,如果有内容,说明日志器配置正常,问题出在数据库相关的代码捕获逻辑上;如果还是为空,继续排查日志器的级别、权限配置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:06:14