PostgreSQL Logları
Düzeltme Öner

PostgreSQL Logları

  • PostgreSQL logları varsayılan olarak veri dizininde /log dizini altında tutulur
  • Log dosyası, syslog, eventlog, csvlog gibi seçenekler kullanılabilir
  • Loglamanın detay seviyesi ayarlanabilir
  • Sorgu logları ayrıca tutulabilir

Logların Yazılışı

Loglama ayarları postgresql.conf dosyasında # ERROR REPORTING AND LOGGING bölümünde bulunur:

log_destination = stderr
logging_collector = on
log_directory = log
log_filename = 'postgresql-%a.log'
log_rotation_age = 1d

Syslog kullanılacaksa:

log_destination = syslog
syslog_facility = 'LOCAL0'
syslog_ident = 'postgres'

Log Seviyeleri

DEBUG1...DEBUG5
INFO
NOTICE
WARNING
ERROR
LOG
FATAL
PANIC
  • Seviyeler ayar dosyasında sınıflandırılmıştır
  • Farklı konularda farklı seviyeler (istemci, sunucu v.b.)
  • Seçilen seviye ve üzeri seviyelerdeki eylemler loglanır

  • Varsayılan loglama seviyeleri:
client_min_messages = notice
log_min_messages = warning
log_min_error_statement = error

Neler Loglanacak?

Varsayılan olarak detay loglar kapalıdır. Açılmak istenirse birçok seçenek var:

  • Bağlantı başlatma ve bitirme logları
  • Sunucu ismi
  • Lock beklemeleri
  • Replikasyon logları

Sunucu performansını değerlendirmek için sorgu logları açılmak istenebilir. Varsayılan olarak kapalıdır.

log_statement = 'none'          # Kullanılabilecek değerler: none, ddl, mod, all

Belirli bir zamandan uzun süren sorguların loglanması için de şu iki ayar var:

log_min_duration_statement = -1
log_duration = off

Log formatını değiştirmek, başına farklı ekler yapmak da mümkündür. Varsayılanı başında zaman damgası olanı:

log_line_prefix = '< %m >'

Bazı Başlangıç Hata Logları

LOG:  could not bind IPv4 socket: Address already in use
HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
FATAL:  could not create TCP/IP listen socket
  • TCP 5432 portu kullanılamıyor.
  • Port başka bir süreç tarafından kullanılıyor.
LOG:  could not bind IPv4 socket: Permission denied
HINT:  Is another postmaster already running on port 666? If not, wait a few seconds and retry.
FATAL:  could not create TCP/IP listen socket
  • Belirtilen portu kullanmaya izin yok. (Rezerve port numarası)
FATAL:  could not create shared memory segment: Invalid argument
DETAIL:  Failed system call was shmget(key=5440001, size=4011376640,03600).
  • Paylaşılan bellek boyutunun çekirdek limiti miktarı, PostgreSQL’in oluşturmaya çalıştığı çalışma alanı boyutu miktarından az!
FATAL:  could not create semaphores: No space left on device
DETAIL:  Failed system call was semget(5440126, 17, 03600).
  • Diskte yer yok.
ERROR: could not set permissions on directory "/var/lib/pgsql": Permission denied
  • SELinux (Erişim Denetimi Aracı) erişim izni vermesi için ayarlanmamış

Bazı İstemci Hataları

psql: could not connect to server: Connection refused
        Is the server running on host "server.joe.com" and accepting
        TCP/IP connections on port 5432?
  • PostgreSQL sunucuda TCP/IP bağlantılarına izin verilmesi ayarlanmamış

  • TCP/IP izin verilmiş ise, güvenlik duvarı 5432 portunu blokluyor olabilir

psql: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
  • Unix soketi üzerinden çalışan servis yok

PgAudit ile Audit Loglarının Tutulması

PostgreSQL’in standart sorgu loglamasına ek olarak sadece belirli işlemlere ve nesnelere ait loglarının tutulmasını sağlar.

PostgreSQL deposundan gerekli eklenti kurulur:

# yum install pgaudit_96

Ayar dosyasına girerek, eklentimizi ekliyoruz:

$ vi postgresql.conf
  
shared_preload_libraries='pgaudit'

Servisi yeniden başlatıp, psql’le bağlandıktan sonra:

CREATE EXTENSION pgaudit;

pgaudit.log değiskeni ile okuma loglarının yakalanması:

ALTER SYSTEM SET pgaudit.log TO 'read';
SELECT pg_reload_conf();
  • all ile bütün logları tutabileceğimiz gibi virgülle read, write şeklinde alabiliriz.

Sorgumuzu çalıştırıp logumuza bakalım.

SELECT count(*) FROM doviz;
$ cd /var/lib/pgsql/11/data/log
$ grep AUDIT postgresql-Tue.log | grep READ

< 2018-09-04 18:18:53.594 +03 > LOG:  AUDIT: SESSION,2,1,READ,SELECT,,,SELECT * FROM doviz;,<not logged>