Hər bir mürəkkəb sistemdə olduğu kimi, PostgreSQL-də də bəzən nəsə düz getmir: sorğular çox uzun çəkir, serverə yük artır və istifadəçilər əsəbləşməyə başlayır. Loglaşdırma — verilənlər bazasının daxili işini izləmək üçün bir üsuldur ki:
- Yavaş sorğuları aşkar et — yəni tətbiqin işini ləngidənləri.
- Performansı optimallaşdır — sorğuların davranışını analiz etməklə.
- Xətaları diaqnostika et — məsələn, məhdudiyyət pozuntuları və ya səhv sintaksis kimi.
- Audit təmin et — serverdə kim nə əməliyyat edib, onu izləmək üçün.
Loglaşdırmanın əsas parametrləri
PostgreSQL-in konfiqurasiya fayllarında (postgresql.conf) loglaşdırma ilə bağlı bir çox parametr var. Gəlin ən vaciblərinə baxaq.
log_statement— SQL-sorğuların loglaşdırılması
log_statement parametri hansı SQL-sorğuların loga yazılacağını təyin edir. O, aşağıdakı dəyərləri ala bilər:
none— sorğuların loglaşdırılmasını söndür.ddl— yalnız data definition komandalarını loglaşdır (məsələn,CREATE,ALTER,DROP).mod— datanı dəyişən bütün komandaları loglaşdır (məsələn,INSERT,UPDATE,DELETE).all— bütün SQL-sorğuları loglaşdır (sadəSELECTdaxil olmaqla).
Nümunə:
Bütün sorğuların loglaşdırılmasını aktiv etmək üçün postgresql.conf faylında belə yaz:
log_statement = 'all'
Əgər yalnız data dəyişikliklərini loglaşdırmaq istəyirsənsə:
log_statement = 'mod'
Konfiqurasiyanı dəyişəndən sonra serveri yenidən başladığını unutma:
sudo systemctl restart postgresql
log_duration— icra müddətinin loglaşdırılması
log_duration parametri hər bir sorğunun icra müddətini loga yazmağa imkan verir. Bu, hansı sorğuların vaxt baxımından daha baha başa gəldiyini tapmaq üçün faydalıdır.
Nümunə:
Sorğuların icra müddətinin loglaşdırılmasını aktiv etmək üçün belə yaz:
log_duration = on
Əgər yalnız yavaş sorğuları loglaşdırmaq istəyirsənsə, log_min_duration_statement parametrindən istifadə et (bunu bir azdan izah edəcəyik).
log_min_duration_statement— yavaş sorğuların loglaşdırılması
Bu parametr yalnız müəyyən olunmuş vaxtdan (millisaniyə ilə) uzun çəkən sorğuları loga yazmağa imkan verir. Bu, verilənlər bazasında "tormoz"ları tapmaq üçün super rahatdır.
Nümunə:
1 saniyədən uzun çəkən sorğuları loglaşdırmaq üçün:
log_min_duration_statement = 1000
Bütün sorğuları müddətindən asılı olmayaraq loglaşdırmaq üçün sadəcə 0 yaz:
log_min_duration_statement = 0
-1 dəyəri müddətə görə loglaşdırmanı söndürür.
log_line_prefix— log mesajının strukturu
log_line_prefix parametri loga yazılan mesajların formatını tənzimləməyə imkan verir. Bu, hər loglaşdırılan sorğuya əlavə kontekst (məsələn, istifadəçi adı, PID, tarix və vaxt) əlavə etmək üçün faydalıdır.
Nümunə:
İstifadəçi adını, verilənlər bazasını, vaxtı və prosesi loga yazmaq üçün belə et:
log_line_prefix = '%t [%p]: [%d]: [%u]: '
Burada:
%t— sorğunun vaxtı.%p— prosesin PID-si.%d— verilənlər bazasının adı.%u— istifadəçi adı.
Bütün mövcud seçimlərin siyahısı: PostgreSQL Sənədləri.
logging_collector— log toplayıcı
logging_collector parametri logların fayllara yazılması mexanizmini aktiv edir. Əgər o söndürülübsə, loglar yalnız standart çıxışa (stdout) göndərilir ki, bu da çox vaxt əlverişli olmur.
Log toplayıcını aktiv etmək üçün:
logging_collector = on
Log faylının yolunu log_directory və log_filename ilə göstərməyi unutma:
log_directory = '/var/log/postgresql'
log_filename = 'postgresql-%Y-%m-%d.log'
Parametrlərin praktik istifadəsi
Gəlin loglaşdırma parametrlərindən real ssenaridə necə istifadə etməyə baxaq.
Ssenari 1: bütün sorğuların loglaşdırılması
Əgər yeni verilənlər bazası ilə işləməyə yeni başlamısansa və hər şeyi görmək istəyirsənsə, belə qur:
log_statement = 'all'
log_line_prefix = '%t [%p]: [%d]: [%u]: '
İndi verilənlər bazasında icra olunan hər bir sorğu log faylına yazılacaq — debug üçün super rahatdır!
Ssenari 2: yavaş sorğuların axtarışı
Əgər serverin bəzən "tormoz"ladığını hiss edirsənsə və problemli sorğuları tapmaq istəyirsənsə, belə qur:
log_min_duration_statement = 500 # 500 ms-dən uzun sorğuları loglaşdırırıq
log_line_prefix = '%t [%p]: [%d]: [%u]: [%r] '
Burada %r — müştərinin IP ünvanını əlavə edir. Bu ayardan sonra serveri yükləyən sorğuları asanlıqla tapacaqsan.
Ssenari 3: minimal loglaşdırma rejimi
Əgər serverin işi stabildirsə, amma audit üçün minimal log lazımdırsa:
log_statement = 'mod'
log_duration = off
Burada yalnız data dəyişiklikləri (məsələn, INSERT, UPDATE) loglaşdırılır.
Logların analizi
Loglar məlumatla dolmağa başlayanda onları analiz etməyi bacarmaq vacibdir! Sən edə bilərsən:
Log faylını mətn redaktorunda aç:
cat /var/log/postgresql/postgresql.log
Yavaş sorğuları tapmaq üçün analiz alətlərindən, məsələn, grep istifadə et:
grep "duration: " /var/log/postgresql/postgresql.log
Logların inkişaf etmiş analizi üçün pgBadger kimi utilitlərdən istifadə et.
Faydalı məsləhətlər
Çox detallı loglaşdırma diskə yükü artıra bilər. Prod sistemi üçün yalnız lazım olan parametrləri istifadə et.
Köhnə log fayllarını mütəmadi olaraq sil və ya arxivləşdir ki, disk dolmasın.
Loglaşdırma yalnız lazım olan məlumatları toplayan parametrlərlə effektivdir. Məsələn, log_min_duration_statement resurslara qənaət etməyə və dəqiq olmağa kömək edir.
Necə, indi PostgreSQL-də loglaşdırmanı qurmaq və sorğuları analiz etmək, performansı artırmaq bizim üçün problem deyil! Bir (yox, bir neçə) tanınmamış, amma yaxşı developer demişkən: "Loglar — sorğuların keçmişinə baxmaq və verilənlər bazasının gələcəyini düzəltmək imkanımızdır".
GO TO FULL VERSION