JavaRush /Курсы /SQL SELF /Логирование с RAISE NOTICE

Логирование с RAISE NOTICE

SQL SELF
52 уровень , 1 лекция
Открыта

Логирование — это процесс записи важных событий и информации о работе приложения или базы данных. В PL/pgSQL это особенно полезно, когда вы создаёте сложные функции, которые вызывают другие функции, работают с триггерами или выполняют множество шагов. Вот несколько ключевых причин, почему логирование необходимо:

  1. Отладка кода: логирование помогает понять, что именно происходит на каждом этапе выполнения функции.
  2. Диагностика проблем: если функция не работает так, как ожидалось, логи помогут определить, где именно возникла ошибка.
  3. Анализ выполнения: зная, какие шаги выполнились (и в каком порядке), вы сможете оптимизировать производительность или найти моменты для улучшения.
  4. Простота в сопровождении: представьте, что через год вы открываете свою функцию и не понимаете, как она работает (а это будет, поверьте). Логи спасают в таких ситуациях.

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

Полезные советы по логированию

  1. Избавляйтесь от ненужных логов: когда ваша функция готова и отлажена, удалите лишние сообщения RAISE NOTICE, чтобы не засорять терминал или интерфейс пользователя.
  2. Используйте осмысленные сообщения: не пишите просто "Шаг 1", "Шаг 2". Дайте понять, что за шаг выполняется.
  3. Будьте осторожны с чувствительной информацией: никогда не включайте в логи данные кредитных карт, пароли или другую конфиденциальную информацию.
2
Задача
SQL SELF, 52 уровень, 1 лекция
Недоступна
Логирование значений переменной
Логирование значений переменной
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ