CodeGym /Các khóa học /SQL SELF /Ghi log với RAISE NOTICE

Ghi log với RAISE NOTICE

SQL SELF
Mức độ, Bài học
Có sẵn

Ghi log là quá trình ghi lại các sự kiện quan trọng và thông tin về hoạt động của ứng dụng hoặc database. Trong PL/pgSQL, nó đặc biệt hữu ích khi bạn viết function phức tạp, gọi các function khác, làm việc với trigger hoặc thực hiện nhiều bước. Dưới đây là vài lý do chính vì sao ghi log lại cần thiết:

  1. Debug code: ghi log giúp bạn hiểu chính xác chuyện gì đang xảy ra ở mỗi bước thực thi function.
  2. Chẩn đoán lỗi: nếu function không chạy như mong đợi, log sẽ giúp bạn xác định chính xác chỗ nào bị lỗi.
  3. Phân tích quá trình thực thi: biết được các bước nào đã chạy (và theo thứ tự nào), bạn sẽ tối ưu hiệu năng hoặc tìm ra điểm cần cải thiện.
  4. Dễ bảo trì: tưởng tượng một năm sau bạn mở lại function của mình mà không hiểu nó hoạt động ra sao (tin mình đi, chuyện này sẽ xảy ra). Log sẽ cứu bạn trong mấy tình huống như vậy.

RAISE NOTICE — nền tảng của ghi log

Nếu bạn là dev và từng dùng print() hoặc console.log() để debug, thì RAISE NOTICE chính là ông anh lớn của chúng trong thế giới PostgreSQL. Đây là lệnh để in thông báo trong lúc function chạy. Các thông báo này sẽ hiện ra ở console, terminal hoặc giao diện nơi bạn chạy query.

Cú pháp RAISE NOTICE

RAISE NOTICE 'Thông báo thực thi';

Nhưng đó mới chỉ là khởi đầu. Bạn có thể chèn biến vào thông báo để nó có ý nghĩa hơn:

RAISE NOTICE 'Giá trị hiện tại của biến: %', my_variable;

Ở đây % là placeholder, còn my_variable là biến mà bạn muốn in giá trị ra.

Nếu bạn muốn in nhiều biến, làm như này nhé:

RAISE NOTICE 'Giá trị: % và %', var1, var2;

Ví dụ dùng RAISE NOTICE

1. In giá trị biến. Khai báo biến trong function và in giá trị của nó bằng RAISE NOTICE.

CREATE OR REPLACE FUNCTION debug_variable_example()
RETURNS VOID AS $$
DECLARE
    my_variable INTEGER := 42;
BEGIN
    RAISE NOTICE 'Giá trị của biến my_variable: %', my_variable;
END;
$$ LANGUAGE plpgsql;

Khi bạn gọi function này:

SELECT debug_variable_example();

Kết quả bạn sẽ thấy kiểu như:

NOTICE:  Giá trị của biến my_variable: 42

2. Ghi log các bước thực thi. Giả sử bạn có function cần thực hiện nhiều bước. Bạn có thể thêm RAISE NOTICE sau mỗi hành động để chắc chắn mọi thứ đang đi đúng hướng.

CREATE OR REPLACE FUNCTION process_data()
RETURNS VOID AS $$
BEGIN
    RAISE NOTICE 'Bước 1: bắt đầu quá trình';

    -- Ở đây chạy một số SQL nào đó
    PERFORM pg_sleep(1); -- Mô phỏng thao tác

    RAISE NOTICE 'Bước 2: quá trình tiếp tục';

    -- Thêm chút SQL nữa
    PERFORM pg_sleep(1); -- Mô phỏng thao tác

    RAISE NOTICE 'Bước 3: quá trình hoàn thành';
END;
$$ LANGUAGE plpgsql;

Gọi function:

SELECT process_data();

Bạn sẽ nhận được:

NOTICE:  Bước 1: bắt đầu quá trình
NOTICE:  Bước 2: quá trình tiếp tục
NOTICE:  Bước 3: quá trình hoàn thành

Bây giờ bạn luôn biết function đang chạy tới đâu rồi nhé.

Ứng dụng thực tế

Cùng xem ví dụ về ghi log khi tính toán. Tạo function tính tổng các số từ 1 đến N và ghi log quá trình:

CREATE OR REPLACE FUNCTION sum_with_logging(n INTEGER)
RETURNS INTEGER AS $$
DECLARE
    total INTEGER := 0;
    i INTEGER;
BEGIN
    RAISE NOTICE 'Bắt đầu tính toán với n = %', n;

    FOR i IN 1..n LOOP
        total := total + i;
        RAISE NOTICE 'Tổng ở bước %: %', i, total;
    END LOOP;

    RAISE NOTICE 'Kết quả tính toán: %', total;

    RETURN total;
END;
$$ LANGUAGE plpgsql;

Gọi function này với tham số 5:

SELECT sum_with_logging(5);

Bạn sẽ thấy:

NOTICE:  Bắt đầu tính toán với n = 5
NOTICE:  Tổng ở bước 1: 1
NOTICE:  Tổng ở bước 2: 3
NOTICE:  Tổng ở bước 3: 6
NOTICE:  Tổng ở bước 4: 10
NOTICE:  Tổng ở bước 5: 15
NOTICE:  Kết quả tính toán: 15

Mẹo hữu ích khi ghi log

  1. Xoá log không cần thiết: khi function đã chạy ngon và debug xong, hãy xoá mấy dòng RAISE NOTICE thừa để khỏi làm rác terminal hoặc giao diện người dùng.
  2. Viết thông báo có ý nghĩa: đừng chỉ ghi "Bước 1", "Bước 2". Hãy cho biết cụ thể bước đó làm gì.
  3. Cẩn thận với thông tin nhạy cảm: đừng bao giờ ghi vào log thông tin thẻ tín dụng, mật khẩu hay dữ liệu bí mật khác.
2
Nhiệm vụ
SQL SELF, mức độ, bài học
Đã khóa
Ghi log giá trị của biến
Ghi log giá trị của biến
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION