日志其实就是把应用或者数据库运行时的重要事件和信息记录下来。在PL/pgSQL里,这个功能特别有用,尤其是你写的函数很复杂、会调用别的函数、用到触发器或者有很多步骤的时候。下面是为啥日志很重要的几个关键理由:
- 调试代码:日志能帮你搞清楚每一步函数到底发生了啥。
- 排查问题:如果函数没按你想的那样跑,日志能帮你定位到底哪儿出错了。
- 分析执行过程:知道哪些步骤执行了(以及顺序),你就能优化性能或者发现可以改进的地方。
- 维护更轻松:想象一下,一年后你再打开自己的函数,完全看不懂自己写的啥(真的会这样,相信我)。这时候日志就能救你一命。
RAISE NOTICE —— 日志的基础
如果你写过代码,肯定用过 print() 或 console.log() 来调试吧,那 RAISE NOTICE 就是PostgreSQL世界里的“老大哥”。它能在函数执行时输出信息消息。这些消息会显示在控制台、终端或者你执行SQL的界面里。
RAISE NOTICE 的语法
RAISE NOTICE '执行消息';
不过这只是个开始。你还可以把变量插进消息里,让日志更有用:
RAISE NOTICE '变量当前值: %', my_variable;
这里 % 是个占位符,my_variable 就是你想输出的变量。
如果你想输出多个变量,可以这样:
RAISE NOTICE '值: % 和 %', var1, var2;
RAISE NOTICE 的用法例子
1. 输出变量的值。 在函数里声明个变量,然后用 RAISE NOTICE 把它的值打印出来。
CREATE OR REPLACE FUNCTION debug_variable_example()
RETURNS VOID AS $$
DECLARE
my_variable INTEGER := 42;
BEGIN
RAISE NOTICE '变量my_variable的值: %', my_variable;
END;
$$ LANGUAGE plpgsql;
当你调用这个函数时:
SELECT debug_variable_example();
你会看到类似这样的结果:
NOTICE: 变量my_variable的值: 42
2. 记录执行步骤。 假如你有个函数要执行好几个步骤。你可以在每个动作后面加个 RAISE NOTICE,这样就能确认一切都按计划走。
CREATE OR REPLACE FUNCTION process_data()
RETURNS VOID AS $$
BEGIN
RAISE NOTICE '步骤1: 过程开始';
-- 这里执行一些SQL代码
PERFORM pg_sleep(1); -- 模拟操作
RAISE NOTICE '步骤2: 过程继续';
-- 再来点SQL
PERFORM pg_sleep(1); -- 模拟操作
RAISE NOTICE '步骤3: 过程结束';
END;
$$ LANGUAGE plpgsql;
调用这个函数:
SELECT process_data();
你会得到:
NOTICE: 步骤1: 过程开始
NOTICE: 步骤2: 过程继续
NOTICE: 步骤3: 过程结束
这样你就随时知道现在执行到哪一步了。
实际应用
咱们来看个日志记录计算过程的例子。 写个函数,算1到N的和,并且把过程都打日志:
CREATE OR REPLACE FUNCTION sum_with_logging(n INTEGER)
RETURNS INTEGER AS $$
DECLARE
total INTEGER := 0;
i INTEGER;
BEGIN
RAISE NOTICE '开始计算,n = %', n;
FOR i IN 1..n LOOP
total := total + i;
RAISE NOTICE '第%步的和: %', i, total;
END LOOP;
RAISE NOTICE '计算结果: %', total;
RETURN total;
END;
$$ LANGUAGE plpgsql;
用参数 5 调用这个函数:
SELECT sum_with_logging(5);
你会看到:
NOTICE: 开始计算,n = 5
NOTICE: 第1步的和: 1
NOTICE: 第2步的和: 3
NOTICE: 第3步的和: 6
NOTICE: 第4步的和: 10
NOTICE: 第5步的和: 15
NOTICE: 计算结果: 15
日志小技巧
- 去掉没用的日志:当你的函数写完、调试好了,把多余的
RAISE NOTICE消息删掉,别让终端或者界面被刷屏。 - 写有意义的消息:别只写“步骤1”、“步骤2”。让别人一看就知道现在在干嘛。
- 注意敏感信息:千万别把信用卡号、密码或者其他敏感数据写进日志。
GO TO FULL VERSION