日誌紀錄就是把應用程式或資料庫運作時的重要事件跟資訊記下來。在 PL/pgSQL 裡這超有用,尤其是你寫的 function 很複雜、會呼叫其他 function、用到 trigger 或是有一堆步驟的時候。這裡有幾個為什麼你一定要做日誌紀錄的重點:
- 除錯程式碼:log 幫你搞懂 function 執行到每個階段到底發生什麼事。
- 問題診斷:如果 function 沒照你想的跑,log 可以幫你找出錯誤點在哪。
- 執行分析:你知道哪些步驟有執行(還有順序),就能優化效能或找到可以改進的地方。
- 好維護:想像你一年後打開自己的 function,完全看不懂自己在寫什麼(真的會這樣)。這時候 log 就是你的救星。
RAISE NOTICE — 日誌紀錄的基礎
如果你是工程師,之前有用過 print() 或 console.log() 來除錯,那 RAISE NOTICE 就是 PostgreSQL 世界裡的進階版。這個指令會在 function 執行時把訊息印出來。這些訊息你可以在 console、terminal 或你執行查詢的介面看到。
RAISE NOTICE 的語法
RAISE NOTICE '執行訊息';
但這只是開始。你可以把變數放進訊息裡,讓 log 更有資訊:
RAISE NOTICE '變數目前的值: %', my_variable;
這裡 % 是 placeholder,而 my_variable 就是你想印出來的變數。
如果你想一次印出多個變數,可以這樣寫:
RAISE NOTICE '數值: % 和 %', var1, var2;
RAISE NOTICE 的使用範例
1. 印出變數的值。 在 function 裡宣告一個變數,然後用 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;
當你呼叫這個 function:
SELECT debug_variable_example();
你會在結果看到類似這樣:
NOTICE: 變數 my_variable 的值: 42
2. 記錄執行步驟。 假設你有個 function 要做好幾個步驟。你可以在每個動作後面加 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;
呼叫 function:
SELECT process_data();
你會得到:
NOTICE: 步驟 1: 開始處理
NOTICE: 步驟 2: 處理中
NOTICE: 步驟 3: 處理完成
這樣你就隨時知道現在執行到哪個階段。
實用應用
來看一個計算過程日誌的例子。 我們來寫一個 function,計算 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 呼叫這個 function:
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
日誌紀錄小技巧
- 把沒用的 log 刪掉:function 寫好、除錯完就把多餘的
RAISE NOTICE訊息刪掉,才不會讓 terminal 或介面一堆雜訊。 - 訊息要有意義:不要只寫「步驟 1」、「步驟 2」。要讓人一看就知道這步在幹嘛。
- 小心敏感資訊:log 裡千萬不要放信用卡資料、密碼或其他機密資訊。
GO TO FULL VERSION