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;
p_error_message— errorun mətnini ötürdüyün input parametridir.p_context— əlavə məlumat ötürmək üçün optional parametrdir. Default olaraqNULLolur.INSERT INTO error_log (error_message, context)—error_logcədvəlinə yeni qeyd əlavə edir.DEFAULT NULL— əgər context verilməyibsə, sahəNULLolur.
İ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;
- Bölmənin yoxlanması:
result := a / bicra olunur. Əgərb = 0olsa, PostgreSQLdivision_by_zeroexception atır. - Exception handler (
EXCEPTION) erroru tutur. - Handler-in içində
log_errorfunksiyasını çağırırıq ki, erroru və səbəb olan parametrləri cədvələ yazsın. - Error yazıldıqdan sonra
RAISE EXCEPTIONilə 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_logcədvəlində sıfıra bölmə haqqında qeyd olacaq.
GO TO FULL VERSION