CodeGym /Kurslar /SQL SELF /PostgreSQL-də error_log cədvəlini avtomatik error loglama...

PostgreSQL-də error_log cədvəlini avtomatik error loglama üçün yaratmaq

SQL SELF
Səviyyə , Dərs
Mövcuddur

Təsəvvür elə, database ilə işləyirsən, bir ton transaction gedir, amma nəsə düz getmir. İstifadəçi şikayət edir, biznes hay-küy salır, amma sən başa düşmürsən ki, konkret nə baş verdi. Bax, burada düzgün error loglama köməyə gəlir. O, sənə imkan verir ki:

  • Errorları database-də saxlayasan və sonra analiz edəsən.
  • Errorun detalları asanlıqla bərpa olunsun: nə vaxt baş verib, mesajı və əlaqəli datalar.
  • Kodunu təkmilləşdirəsən, çünki logları analiz edəndə tipik errorları tapa bilirsən.

Qısası, loglama database üçün müşahidə kamerası kimidir: nə baş verdiyini və nə vaxt olduğunu görürsən.

error_log cədvəlini yaradırıq

Gəlin, necə deyərlər, təməlindən başlayaq. Bizə errorlar haqqında məlumatı saxlayacağımız bir cədvəl lazımdır. Cədvəldə belə sahələr olacaq:

  • id — errorun unikal identifikatoru.
  • error_message — errorun mətn mesajı.
  • error_time — errorun baş verdiyi vaxt.
  • (Əlavə olaraq) context — errorun konteksti, əgər detalları saxlamaq istəsək.
CREATE TABLE error_log (
    id SERIAL PRIMARY KEY,        -- Errorun unikal identifikatoru
    error_message TEXT NOT NULL,  -- Error haqqında mətn mesajı
    error_time TIMESTAMP NOT NULL DEFAULT NOW(), -- Errorun baş vermə vaxtı
    context JSONB                 -- Error haqqında əlavə məlumatlar
);

Bura nə baş verir?

  • id SERIAL PRIMARY KEY — bu sahə hər bir qeyd üçün avtomatik unikal identifikator yaradır.
  • error_message TEXT NOT NULL — burada errorun mətn mesajı saxlanacaq. Bu sahə mütləq doldurulmalıdır.
  • error_time TIMESTAMP NOT NULL DEFAULT NOW() — hadisənin vaxtını qeyd edən sahədir. Əgər dəyər göstərməsən, DEFAULT NOW() sayəsində avtomatik cari vaxt yazılacaq.
  • context JSONB — optional, məsələn, errorun baş verdiyi əməliyyat haqqında əlavə məlumat saxlamaq üçün.

CREATE TABLE komandasını işlətdikdən sonra database-də logları saxlamaq üçün struktur yaranacaq.

Errorların cədvələ yazılması nümunəsi

İndi cədvəl hazırdır, keçək praktiki hissəyə: error haqqında məlumatı cədvələ necə yazmaq olar. Bir funksiya yazacağıq ki, errorun mətnini və vaxtını error_log-a yazsın.

Error yazmaq üçün funksiya nümunəsi

CREATE OR REPLACE FUNCTION log_error(p_error_message TEXT, p_context JSONB DEFAULT NULL)
RETURNS VOID AS $$
BEGIN
    INSERT INTO error_log (error_message, context)
    VALUES (p_error_message, p_context);
END;
$$ LANGUAGE plpgsql;
  1. p_error_message — errorun mətnini ötürdüyün input parametridir.
  2. p_context — əlavə məlumat ötürmək üçün optional parametrdir. Default olaraq NULL olur.
  3. INSERT INTO error_log (error_message, context)error_log cədvəlinə yeni qeyd əlavə edir.
  4. DEFAULT NULL — əgər context verilməyibsə, sahə NULL olur.

İndi error mesajını yazmaq istəsən, funksiyanı belə çağıra bilərsən:

SELECT log_error('Sorgunun icrasinda xeta', '{"query": "SELECT * FROM data"}');

Bu, error_log cədvəlinə yeni qeyd əlavə edəcək.

Errorların avtomatik loglanması

Hər dəfə SELECT log_error(...) əl ilə yazmaq bir az əziyyətli ola bilər. Gəlin, bu prosesi exception handling ilə avtomatlaşdıraq.

Exception handling ilə funksiya nümunəsi.

CREATE OR REPLACE FUNCTION divide_numbers(a NUMERIC, b NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
    result NUMERIC;
BEGIN
    -- Gəlin bölməni yoxlayaq
    result := a / b;

    -- Nəticəni qaytarırıq
    RETURN result;
EXCEPTION
    WHEN division_by_zero THEN
        -- Erroru log edirik və context ötürürük
        PERFORM log_error('Sıfıra bölmə', jsonb_build_object('a', a, 'b', b));
        -- İstifadəçiyə exception atırıq
        RAISE EXCEPTION 'Bölmə % ilə % mümkün deyil — bölən sıfırdır', a, b;
END;
$$ LANGUAGE plpgsql;
  1. Bölmənin yoxlanması: result := a / b icra olunur. Əgər b = 0 olsa, PostgreSQL division_by_zero exception atır.
  2. Exception handler (EXCEPTION) erroru tutur.
  3. Handler-in içində log_error funksiyasını çağırırıq ki, erroru və səbəb olan parametrləri cədvələ yazsın.
  4. Error yazıldıqdan sonra RAISE EXCEPTION ilə istifadəçiyə də error mesajı ötürülür.

Çağırış nümunəsi:

SELECT divide_numbers(10, 0);

Nəticə:

  • İstifadəçi belə bir error görəcək: Bölmə 10 ilə 0 mümkün deyil — bölən sıfırdır.
  • error_log cədvəlində sıfıra bölmə haqqında qeyd olacaq.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION