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.