通过Stored Procedure执行MySQL查询时能否将错误日志写入文本文件
MySQL存储过程自动记录错误信息到文本文件实现方案
前置条件
- MySQL实例需开启
secure_file_priv配置,且配置的目录为你要写入日志的目标目录,可执行SHOW VARIABLES LIKE 'secure_file_priv';查询当前配置 - 运行MySQL进程的操作系统用户对目标日志目录有读写权限
- 存储过程执行用户拥有
FILE权限
可直接植入的示例语法
DELIMITER // CREATE PROCEDURE 你的存储过程名称(IN 自定义入参1 数据类型, IN 自定义入参2 数据类型) BEGIN -- 声明错误信息存储变量 DECLARE v_error_code INT; DECLARE v_error_msg TEXT; DECLARE v_error_time DATETIME DEFAULT CURRENT_TIMESTAMP; -- 日志存储路径,需和secure_file_priv配置的目录保持一致 DECLARE v_log_path VARCHAR(255) DEFAULT '/var/lib/mysql-files/'; DECLARE v_log_file VARCHAR(255); -- 声明异常捕获句柄,发生SQL错误时自动触发 DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN -- 读取错误详情 GET CURRENT DIAGNOSTICS CONDITION 1 v_error_code = MYSQL_ERRNO, v_error_msg = MESSAGE_TEXT; -- 生成带时间戳的独立日志文件名,规避MySQL不支持追加写已有文件的限制 SET v_log_file = CONCAT(v_log_path, 'sp_error_', DATE_FORMAT(v_error_time, '%Y%m%d%H%i%s%f'), '.log'); -- 写入错误信息到文本文件 SELECT CONCAT( '错误发生时间: ', v_error_time, '\n', '错误码: ', v_error_code, '\n', '错误描述: ', v_error_msg, '\n', '所属存储过程: 你的存储过程名称', '\n', '----------------------------------\n' ) INTO OUTFILE v_log_file CHARACTER SET utf8mb4 LINES TERMINATED BY ''; -- 可选:重新抛出错误,让存储过程调用方感知到异常 RESIGNAL; END; -- *************************** -- 下方写入你自己的业务SQL逻辑 -- *************************** -- 测试时可放开下方故意写错的SQL,触发错误验证日志写入逻辑 -- INSERT INTO 不存在的测试表(col) VALUES (1); END // DELIMITER ;
注意事项
- 若需要所有错误写入同一个日志文件,建议先在数据库中建一张错误日志表,异常捕获时先写入表,再用定时任务定期同步表数据到文本文件即可
- 生产环境不要关闭
secure_file_priv配置,避免任意目录写入带来的安全风险 - 存储过程执行用户的
FILE权限授权语句为GRANT FILE ON *.* TO '你的用户名'@'访问地址';,授权后执行FLUSH PRIVILEGES;生效
内容的提问来源于stack exchange,提问作者sp123
相关产品推荐
相关产品推荐

