Logowanie — to proces zapisywania ważnych zdarzeń i informacji o działaniu aplikacji albo bazy danych. W PL/pgSQL to szczególnie przydatne, kiedy tworzysz złożone funkcje, które wywołują inne funkcje, pracują z triggerami albo robią sporo kroków. Oto kilka kluczowych powodów, czemu logowanie jest potrzebne:
- Debugowanie kodu: logowanie pomaga ogarnąć, co się dzieje na każdym etapie działania funkcji.
- Diagnozowanie problemów: jeśli funkcja nie działa tak, jak się spodziewasz, logi pomogą znaleźć, gdzie dokładnie pojawił się błąd.
- Analiza wykonania: wiedząc, które kroki się wykonały (i w jakiej kolejności), możesz zoptymalizować wydajność albo znaleźć miejsca do poprawy.
- Łatwiejsze utrzymanie: wyobraź sobie, że za rok otwierasz swoją funkcję i nie masz pojęcia, jak ona działa (a tak będzie, serio). Logi ratują w takich sytuacjach.
RAISE NOTICE — podstawa logowania
Jeśli jesteś programistą i kiedyś używałeś print() albo console.log() do debugowania, to RAISE NOTICE to taki ich starszy brat w świecie PostgreSQL. To komenda, która wypisuje info podczas działania funkcji. Te komunikaty widać w konsoli, terminalu albo interfejsie, gdzie odpalasz swój query.
Składnia RAISE NOTICE
RAISE NOTICE 'Komunikat o wykonaniu';
Ale to dopiero początek. Możesz wrzucać zmienne do swoich komunikatów, żeby były bardziej konkretne:
RAISE NOTICE 'Aktualna wartość zmiennej: %', my_variable;
Tutaj % działa jako placeholder, a my_variable — to zmienna, której wartość chcesz wypisać.
Jeśli chcesz wypisać kilka zmiennych, możesz zrobić to tak:
RAISE NOTICE 'Wartości: % i %', var1, var2;
Przykłady użycia RAISE NOTICE
1. Wypisywanie wartości zmiennej. Zadeklarujemy zmienną w funkcji i wypiszemy jej wartość przez RAISE NOTICE.
CREATE OR REPLACE FUNCTION debug_variable_example()
RETURNS VOID AS $$
DECLARE
my_variable INTEGER := 42;
BEGIN
RAISE NOTICE 'Wartość zmiennej my_variable: %', my_variable;
END;
$$ LANGUAGE plpgsql;
Kiedy wywołasz tę funkcję:
SELECT debug_variable_example();
W wynikach zobaczysz coś takiego:
NOTICE: Wartość zmiennej my_variable: 42
2. Logowanie kroków wykonania. Wyobraź sobie, że masz funkcję, która ma zrobić kilka kroków. Możesz dodać RAISE NOTICE po każdym działaniu, żeby mieć pewność, że wszystko idzie zgodnie z planem.
CREATE OR REPLACE FUNCTION process_data()
RETURNS VOID AS $$
BEGIN
RAISE NOTICE 'Krok 1: start procesu';
-- Tutaj leci jakiś SQL
PERFORM pg_sleep(1); -- Symulacja operacji
RAISE NOTICE 'Krok 2: proces trwa';
-- Jeszcze trochę SQL
PERFORM pg_sleep(1); -- Symulacja operacji
RAISE NOTICE 'Krok 3: proces zakończony';
END;
$$ LANGUAGE plpgsql;
Wywołując funkcję:
SELECT process_data();
Dostaniesz:
NOTICE: Krok 1: start procesu
NOTICE: Krok 2: proces trwa
NOTICE: Krok 3: proces zakończony
Teraz zawsze wiesz, na którym etapie jesteś.
Praktyczne zastosowanie
Sprawdźmy przykład logowania obliczeń. Stworzymy funkcję, która liczy sumę liczb od 1 do N i loguje proces:
CREATE OR REPLACE FUNCTION sum_with_logging(n INTEGER)
RETURNS INTEGER AS $$
DECLARE
total INTEGER := 0;
i INTEGER;
BEGIN
RAISE NOTICE 'Start obliczeń dla n = %', n;
FOR i IN 1..n LOOP
total := total + i;
RAISE NOTICE 'Suma na etapie %: %', i, total;
END LOOP;
RAISE NOTICE 'Wynik obliczeń: %', total;
RETURN total;
END;
$$ LANGUAGE plpgsql;
Wywołując tę funkcję z parametrem 5:
SELECT sum_with_logging(5);
Dostaniesz:
NOTICE: Start obliczeń dla n = 5
NOTICE: Suma na etapie 1: 1
NOTICE: Suma na etapie 2: 3
NOTICE: Suma na etapie 3: 6
NOTICE: Suma na etapie 4: 10
NOTICE: Suma na etapie 5: 15
NOTICE: Wynik obliczeń: 15
Przydatne tipy do logowania
- Pozbywaj się niepotrzebnych logów: kiedy twoja funkcja jest gotowa i przetestowana, usuń zbędne
RAISE NOTICE, żeby nie zaśmiecać terminala albo interfejsu użytkownika. - Używaj sensownych komunikatów: nie pisz po prostu "Krok 1", "Krok 2". Daj znać, co się dzieje w danym kroku.
- Uważaj na wrażliwe dane: nigdy nie wrzucaj do logów numerów kart, haseł ani innych poufnych informacji.
GO TO FULL VERSION