PostgreSQL sorguları nasıl kaydedilir?


373

PostgreSQL 8.3 tarafından çalıştırılan tüm SQL kayıtlarını nasıl etkinleştirebilirim?

Düzenlendi (daha fazla bilgi) Bu satırları değiştirdim:

log_directory = 'pg_log'                    
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'

Ve PostgreSQL hizmetini yeniden başlatın ... ancak günlük oluşturulmadı ... Windows Server 2003 kullanıyorum.

Herhangi bir fikir?


15
Bu önemlidir:logging_collector = on
bonyiii

Ayrıca, bazı GNU / Linux dağıtımlarında (örneğin Debian Jessie) systemctl restart postgresqlyapılandırdığınız PostgreSQL hizmetini gerçekten yeniden başlatamayabileceğine dikkat edin (nedenini henüz anlamıyorum), bu nedenle yapılandırma dosyasındaki değişiklikler uygulanmayacaktır. Kullanımı pg_ctl(veya pg_ctlclusterDebian'da) daha güvenlidir .
Skippy le Grand Gourou

4
Sadece PostgreSQL 9.5 ile Ubuntu 16.04 LTS bu test ve systemctl reload postgresql, systemctl restart postgresql, service postgresql reloadve service postgresql restarttüm yapılandırma etkili değiştirir hale.
Ben Johnson

Yanıtlar:


465

Senin içinde data/postgresql.confdosyaya değiştirmek log_statementiçin ayarı 'all'.


Düzenle

Yeni bilgilerinize bakarak, doğrulamak için birkaç ayar olabileceğini söyleyebilirim:

  • log_destinationdeğişkeni açtığınızdan emin olun
  • açtığınızdan emin olun logging_collector
  • Ayrıca emin olun log_directorydizin zaten içeride ait mevcut datadizine ve postgres kullanıcı yazabildiğinizi söyledi.

3
Yani merak ediyorum, bu, sunucuyu yeniden başlatmadığım sürece PostgreSQL'in günlüğü etkinleştiremeyeceği anlamına mı geliyor? MySQL'de "SET GLOBAL general_log = 'ON';" kadar basittir.
Antony

7
MySQL gibi bir SQL deyimi kullanarak bunu yapmanın bir yolu olup olmadığını bilmiyorum, ancak çalışan bir sunucuya yapılandırmayı yeniden yüklemek için bir komut gönderebilirsinizpg_ctl reload
Jarret Hardie

9
PostgreSQL'in parametrelerini henüz SQL deyimleri aracılığıyla değiştirmenin bir yolu yoktur (9.2 itibariyle). Çoğu günlük parametresi tam sunucu yeniden başlatılmadan değiştirilebilir, bunun yerine pg_ctl yeniden yükleme yapılarak değiştirilebilir. Ancak, logging_collector öğesini değiştirmek için yeniden başlatma gerekir.
Greg Smith

6
Postgres 9.4 ve yeni ALTER SYSTEMkomutla bir süper kullanıcı SQL'den GUC parametrelerini ayarlayabilir.
Erwin Brandstetter

6
dataCevap belirtilen dizin onun edebi adı değil; data_directoryPostgreSQL yapılandırma dosyasındaki değişkene atanan yolu ifade eder . Debian ve Ubuntu GNU / Linux'ta bu dosya genellikle sunucu sürümünün /etc/postgresql/$v/main/postgresql.confolduğu yerde bulunur $v. Ayrıca, yukarıda belirtilen sistemlerde, log_destination = 'stderr'çıktı ne zaman yazılır , sunucu sürümü /var/log/postgresql/postgresql-$v-main.lognerede $v(içindeki bazı konumlara değil data_directory).
Ben Johnson

104

Düzenleyin /etc/postgresql/9.3/main/postgresql.confve satırları aşağıdaki gibi değiştirin.

Not : postgresql.confDosyayı bulamadıysanız, sadece $locate postgresql.confbir terminal yazın

  1. #log_directory = 'pg_log' için log_directory = 'pg_log'

  2. #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' için log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

  3. #log_statement = 'none' için log_statement = 'all'

  4. #logging_collector = off için logging_collector = on

  5. İsteğe bağlı :SELECT set_config('log_statement', 'all', true);

  6. sudo /etc/init.d/postgresql restart veya sudo service postgresql restart

  7. Postgresql'de yangın sorgusu select 2+2

  8. Geçerli oturum açmayı bul /var/lib/pgsql/9.2/data/pg_log/

Günlük dosyaları bir süre içinde çok fazla büyüme eğilimindedir ve makinenizi öldürebilir. Güvenliğiniz için, günlükleri silecek ve postgresql sunucusunu yeniden başlatacak bir bash betiği yazın.

Teşekkürler @paul, @Jarret Hardie, @ Zoltán, @Rix Beck, @Latif Premani


2
Debian streç, ben de # log_destination = 'stderr'bu işe yaramadan önce yapılandırma dosyasında uncomment zorunda kaldı .
phihag

Adımınızı dikkatle takip ediyorum ve işe yaramıyor. Yeniden başlatılması gerekiyor mu?
Yohanes AI

2
bir bash betiği yazmak istemiyorsanız, ancak günlüklerin aylık olarak üzerine yazılmasını istiyorsanız: log_filename = 'postgresql-%d.log've her yeniden başlatmadan sonra üzerine yazılmaz, her gün için eklenir ve her ayın üzerine yazılır. Tabii ki 28,29,30,31 ayına bağlı olarak farklı günler var - ama fikri anlıyorsunuz.
sojim2

44
SELECT set_config('log_statement', 'all', true);

Karşılık gelen bir kullanıcı hakkı ile bağlandıktan sonra yukarıdaki sorguyu kullanabilirsiniz. Bu, oturum sona erene kadar günlük kaydını etkileyecektir.


7
Genelde daha temiz SET log_statement = 'all'veya (işlem seviyesi için) SET LOCAL log_statement = 'all'. Ayrıca client_min_messagesve log_min_messagesayarlarıyla da ilgilenebilirsiniz .
Craig Ringer

1
Bu harika, çünkü sadece bağlantımın mesajlarını kaydetmek istiyorum. Ne yazık ki alıyorum: permission denied to set parameter "log_statement"benim kullanıcı süper kullanıcı olmadığı için.
guettli

3
DB yöneticisinden işlevi yürütmek için hibe isteyebilirsiniz. GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Rix Beck

35

Ayrıca PostgreSQL'de şu satırları eklemeniz ve sunucuyu yeniden başlatmanız gerekir:

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on

2
logging_collector = açık gerekli
wjin

Tıkır tıkır çalışıyor. Yapılandırma dosyasındaki yorumla kafam karıştı Required to be on for csvlogs, bu seçeneğin sadece sorgu çıktılarını değil, çıktıları günlüğe kaydetmek olduğunu düşünüyorum, ancak durum böyle değil.
Jacopofar

Data / postgresql.conf dosyanızda, log_statement ayarını 'all' olarak değiştirin.
FlyingV

32

Bilginize: Diğer çözümler yalnızca varsayılan veritabanından - genellikle postgres- başkalarını - günlüğe kaydetmek için; onların çözümü ile başlayın; sonra:

ALTER DATABASE your_database_name
SET log_statement = 'all';

Ref: https://serverfault.com/a/376888 /log_statement



20

Yukarıdaki cevaplar +1. Aşağıdaki yapılandırmayı kullanıyorum

log_line_prefix = '%t %c %u ' # time sessionid user
log_statement = 'all'

10

Bu web sayfasında bulunan talimatlara dayanarak PostgreSQL 9.2 çalıştıran CentOS 6.4 (Red Hat 4.4.7-3) hakkında daha fazla bilgi edinmek için :

  1. Set (yorumsuz) log_statement = 'all've log_min_error_statement = erroriçinde /var/lib/pgsql/9.2/data/postgresql.conf.
  2. PostgreSQL yapılandırmasını yeniden yükleyin. Benim için bu koşarak yapıldı /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  3. Bugünün girişini bul /var/lib/pgsql/9.2/data/pg_log/

4
Yeniden başlatmanız gerekmez - a pg_ctl reloadyeterlidir ve bağlantıları kesmez. Bu cevabın zaten buradakilere bir şey eklediğine ikna olmamış.
Craig Ringer

1
@CraigRinger Yorum için teşekkürler, bu oldukça önemli bir gerçek. Önerinizi denedikten sonra cevabı güncelleyeceğim. Bu yanıtı öncelikle kendim için referans olarak yazdım, çünkü o zamanlar UNIX ile çok az deneyimim vardı ve gerekli tüm bilgileri tek bir yerde (örneğin postgresql.conf ve günlük dosyalarının yerleri) almak istedim.
Zoltán

0

Ayrıca, her ifadeyi günlüğe kaydetmek için bu parametreyi ayarlamanız gerekir:

log_min_duration_statement = 0

0

log_statementBazı postgres yapılandırma dosyasında ayarlamaya çalışıyordum ama aslında dosya bizim postgres tarafından okunmadı.

İsteği kullanarak doğruladım:

select *
from pg_settings

[...]
log_statement   none # That was not the value i was expected for !!!

Bu yolu kullanıyorum https://stackoverflow.com/a/41912295/2294168

command: postgres -c config_file=/etc/postgresql.conf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.