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
相关产品推荐
相关产品推荐

