DB2存储过程中如何按Debug/Info等级别输出日志?
DB2存储过程中实现带级别(Debug/Info等)的日志输出
完全可以实现带日志级别的输出功能,核心思路是封装一个自定义的日志存储过程,结合DBMS_OUTPUT.PUT_LINE实现按级别过滤输出。以下是具体实现方案:
1. 基础实现:固定日志级别过滤
先创建一个可复用的日志过程,内置日志级别判断逻辑,只有当消息级别高于或等于当前设定的日志级别时才输出。
1.1 创建日志存储过程
CREATE OR REPLACE PROCEDURE LOG_MESSAGE(p_log_level VARCHAR(10), p_message VARCHAR(1000)) LANGUAGE SQL BEGIN -- 定义日志级别对应的优先级(数字越小级别越低) DECLARE v_level_priority INT; DECLARE v_current_priority INT; -- 默认日志级别为INFO,可根据需求直接修改 DECLARE v_current_log_level VARCHAR(10) := 'INFO'; -- 转换级别为优先级数值,方便比较 SET v_level_priority = CASE p_log_level WHEN 'DEBUG' THEN 1 WHEN 'INFO' THEN 2 WHEN 'WARN' THEN 3 WHEN 'ERROR' THEN 4 ELSE 0 -- 未知级别不输出 END; SET v_current_priority = CASE v_current_log_level WHEN 'DEBUG' THEN 1 WHEN 'INFO' THEN 2 WHEN 'WARN' THEN 3 WHEN 'ERROR' THEN 4 ELSE 0 END; -- 仅输出级别不低于当前设定的消息 IF v_level_priority >= v_current_priority THEN CALL DBMS_OUTPUT.PUT_LINE('[' || p_log_level || '] ' || CURRENT_TIMESTAMP || ' - ' || p_message); END IF; END@
1.2 在业务存储过程中调用日志过程
CREATE OR REPLACE PROCEDURE BUSINESS_PROC() LANGUAGE SQL BEGIN CALL LOG_MESSAGE('DEBUG', '业务过程开始执行'); CALL LOG_MESSAGE('INFO', '完成用户数据查询'); CALL LOG_MESSAGE('WARN', '检测到部分数据为空,将使用默认值'); CALL LOG_MESSAGE('ERROR', '写入订单数据失败'); END@
1.3 启用DBMS_OUTPUT输出
在会话中执行以下命令开启输出,才能看到日志内容:
SET SERVEROUTPUT ON;
2. 进阶实现:动态调整日志级别
如果需要不用修改代码就能调整日志级别,可以将级别配置存储到表中,让日志过程动态读取配置:
2.1 创建日志配置表
CREATE TABLE LOG_CONFIG ( CONFIG_KEY VARCHAR(50) PRIMARY KEY, CONFIG_VALUE VARCHAR(50) ); -- 初始化默认日志级别为INFO INSERT INTO LOG_CONFIG VALUES ('CURRENT_LOG_LEVEL', 'INFO');
2.2 修改日志过程读取动态配置
CREATE OR REPLACE PROCEDURE LOG_MESSAGE(p_log_level VARCHAR(10), p_message VARCHAR(1000)) LANGUAGE SQL BEGIN DECLARE v_level_priority INT; DECLARE v_current_priority INT; DECLARE v_current_log_level VARCHAR(10); -- 从配置表读取当前日志级别 SELECT CONFIG_VALUE INTO v_current_log_level FROM LOG_CONFIG WHERE CONFIG_KEY = 'CURRENT_LOG_LEVEL'; SET v_level_priority = CASE p_log_level WHEN 'DEBUG' THEN 1 WHEN 'INFO' THEN 2 WHEN 'WARN' THEN 3 WHEN 'ERROR' THEN 4 ELSE 0 END; SET v_current_priority = CASE v_current_log_level WHEN 'DEBUG' THEN 1 WHEN 'INFO' THEN 2 WHEN 'WARN' THEN 3 WHEN 'ERROR' THEN 4 ELSE 0 END; IF v_level_priority >= v_current_priority THEN CALL DBMS_OUTPUT.PUT_LINE('[' || p_log_level || '] ' || CURRENT_TIMESTAMP || ' - ' || p_message); END IF; END@
之后只需更新LOG_CONFIG表的CONFIG_VALUE,就能动态切换日志级别,比如切换到DEBUG级别:
UPDATE LOG_CONFIG SET CONFIG_VALUE = 'DEBUG' WHERE CONFIG_KEY = 'CURRENT_LOG_LEVEL';
内容的提问来源于stack exchange,提问作者DB2fan
相关产品推荐
相关产品推荐

