Логування — це процес запису важливих подій і інформації про роботу застосунку або бази даних. У PL/pgSQL це особливо корисно, коли ти створюєш складні функції, які викликають інші функції, працюють з тригерами або виконують купу кроків. Ось кілька ключових причин, чому логування необхідне:
- Дебаг коду: логування допомагає зрозуміти, що саме відбувається на кожному етапі виконання функції.
- Діагностика проблем: якщо функція не працює так, як ти очікував, логи допоможуть знайти, де саме з'явилась помилка.
- Аналіз виконання: знаючи, які кроки виконались (і в якому порядку), ти зможеш оптимізувати продуктивність або знайти моменти для покращення.
- Простота супроводу: уяви, що через рік ти відкриваєш свою функцію і не розумієш, як вона працює (а таке буде, повір). Логи рятують у таких ситуаціях.
RAISE NOTICE — основа логування
Якщо ти програміст і колись використовував print() або console.log() для дебагу, то RAISE NOTICE можна назвати їхнім старшим братом у світі PostgreSQL. Це команда, яка виводить інформаційні повідомлення під час виконання функції. Ці повідомлення видно в консолі, терміналі або інтерфейсі, де виконується твій запит.
Синтаксис RAISE NOTICE
RAISE NOTICE 'Повідомлення про виконання';
Але це тільки початок. Ти можеш вставляти змінні у свої повідомлення, щоб зробити їх інформативнішими:
RAISE NOTICE 'Поточне значення змінної: %', my_variable;
Тут % виступає як placeholder, а 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". Дай зрозуміти, який саме крок виконується.
- Будь обережний з чутливою інформацією: ніколи не включай у логи дані кредитних карток, паролі чи іншу конфіденційну інформацію.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ