Jak zalogować się do zapytań PostgreSQL?

372

Jak włączyć rejestrowanie całego SQL wykonywanego przez PostgreSQL 8.3?

Edytowane (więcej informacji) Zmieniłem następujące linie:

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

I ponownie uruchom usługę PostgreSQL ... ale nie utworzono dziennika ... Używam Windows Server 2003.

Jakieś pomysły?

Paweł
źródło
15
Jest to ważne:logging_collector = on
bonyiii
Pamiętaj też, że w niektórych dystrybucjach GNU / Linux (np. Debian Jessie) systemctl restart postgresqlmoże nie zrestartować skonfigurowanej usługi PostgreSQL (jeszcze nie rozumiem dlaczego), więc zmiany w pliku konfiguracyjnym nie zostaną zastosowane. Bezpieczniej jest używać pg_ctl(lub pg_ctlclusterna Debianie).
Skippy le Grand Gourou,
4
I właśnie przetestowane w Ubuntu 16.04 LTS, PostgreSQL 9.5, i systemctl reload postgresql, systemctl restart postgresql, service postgresql reloadi service postgresql restartwszystko czyni konfiguracja zmienia skuteczne.
Ben Johnson,

Odpowiedzi:

464

W swoim data/postgresql.confpliku zmień log_statementustawienie na 'all'.


Edytować

Patrząc na nowe informacje, powiedziałbym, że może istnieć kilka innych ustawień do weryfikacji:

  • upewnij się, że włączyłeś log_destinationzmienną
  • pamiętaj, aby włączyć logging_collector
  • upewnij się również, że log_directorykatalog już istnieje w datakatalogu i że użytkownik postgres może do niego pisać.
Jarret Hardie
źródło
3
Ciekawe, czy to oznacza, że ​​PostgreSQL nie może włączyć rejestrowania, dopóki nie zrestartuję serwera? W MySQL jest to tak proste, jak „SET GLOBAL general_log = 'ON';”
Antony,
7
Sam nie wiem, czy można to zrobić za pomocą instrukcji SQL, takiej jak MySQL, ale możesz wysłać działającemu serwerowi polecenie przeładowania konfiguracjipg_ctl reload
Jarret Hardie,
9
PostgreSQL nie ma jeszcze możliwości zmiany swoich parametrów za pomocą instrukcji SQL (od wersji 9.2). Większość parametrów rejestrowania można zmienić bez pełnego restartu serwera, po prostu zamiast tego wykonując pg_ctl. Jednak zmiana wymaga rejestrowania_kolektora po ponownym uruchomieniu.
Greg Smith,
6
W Postgres 9.4 i nowym ALTER SYSTEMpoleceniu administrator może ustawiać parametry GUC z SQL.
Erwin Brandstetter,
6
dataKatalog cytowana w odpowiedzi nie jest jego nazwa dosłowny; odnosi się do ścieżki przypisanej do data_directoryzmiennej w pliku konfiguracyjnym PostgreSQL. W systemach Debian i Ubuntu GNU / Linux plik ten zwykle znajduje się w miejscu /etc/postgresql/$v/main/postgresql.conf, gdzie $vjest wersja serwera. Również w wyżej wymienionych systemach, kiedy log_destination = 'stderr'dane wyjściowe są zapisywane /var/log/postgresql/postgresql-$v-main.log, gdzie $vjest wersja serwera (nie do jakiejś lokalizacji w środku data_directory).
Ben Johnson
104

Edytuj /etc/postgresql/9.3/main/postgresql.confi zmień linie w następujący sposób.

Uwaga : jeśli nie znalazłeś postgresql.confpliku, po prostu wpisz $locate postgresql.confterminal

  1. #log_directory = 'pg_log' do log_directory = 'pg_log'

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

  3. #log_statement = 'none' do log_statement = 'all'

  4. #logging_collector = off do logging_collector = on

  5. Opcjonalnie :SELECT set_config('log_statement', 'all', true);

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

  7. Zapytanie ogniowe w postgresql select 2+2

  8. Znajdź aktualne logowanie /var/lib/pgsql/9.2/data/pg_log/

Pliki dziennika często rosną z czasem i mogą zabić Twój komputer. Dla własnego bezpieczeństwa napisz skrypt bash, który usunie dzienniki i zrestartuje serwer postgresql.

Dzięki @paul, @Jarret Hardie, @ Zoltán, @Rix Beck, @Latif Premani

Vijay
źródło
2
Na debian stretch musiałem również odkomentować # log_destination = 'stderr'plik konfiguracyjny, zanim to zadziałało.
phihag
Uważnie śledzę twój krok i to nie działa. Czy to wymaga ponownego uruchomienia?
Yohanes AI
2
jeśli nie chcesz pisać skryptu bash, ale po prostu chcesz, aby dzienniki nadpisywały co miesiąc, zrób to: log_filename = 'postgresql-%d.log'i nie, nie będzie to nadpisywać po każdym ponownym uruchomieniu, będzie dołączane na każdy dzień i nadpisuje co miesiąc. Oczywiście są różne dni w zależności od miesiąca 28, 29, 30, 31 - ale masz pomysł.
sojim2
44
SELECT set_config('log_statement', 'all', true);

Przy odpowiednim prawie użytkownika może skorzystać z powyższego zapytania po połączeniu. Wpłynie to na rejestrowanie do zakończenia sesji.

Rix Beck
źródło
7
Zasadniczo jest łatwiejszy w użyciu SET log_statement = 'all'lub (na poziomie transakcji) SET LOCAL log_statement = 'all'. Możesz być także zainteresowany ustawieniami client_min_messagesi log_min_messages.
Craig Ringer
1
To świetnie, ponieważ chcę rejestrować tylko wiadomości z mojego połączenia. Niestety dostaję: permission denied to set parameter "log_statement"ponieważ mój użytkownik nie jest superużytkownikiem.
guettli
3
Możesz poprosić administratora DB o granty na wykonanie funkcji. 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

Musisz także dodać te wiersze w PostgreSQL i zrestartować serwer:

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on
Latif Premani
źródło
2
logowanie_kolektora = włączone jest konieczne
wjin
Działa jak marzenie. Byłem zdezorientowany komentarzem do pliku konfiguracyjnego, mówiąc Required to be on for csvlogs, że ta opcja polega na rejestrowaniu danych wyjściowych zapytania, a nie tylko instrukcji, ale tak nie jest.
Jacopofar,
W pliku data / postgresql.conf zmień ustawienie log_statement na „all”.
FlyingV
32

FYI: Inne rozwiązania rejestrują tylko instrukcje z domyślnej bazy danych - zwykle postgres- w celu rejestrowania innych; zacznij od ich rozwiązania; następnie:

ALTER DATABASE your_database_name
SET log_statement = 'all';

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

W
źródło
20

+1 do powyższych odpowiedzi. Używam następującej konfiguracji

log_line_prefix = '%t %c %u ' # time sessionid user
log_statement = 'all'
Shekhar
źródło
10

Aby uzyskać więcej informacji na temat CentOS 6.4 (Red Hat 4.4.7-3) z systemem PostgreSQL 9.2, w oparciu o instrukcje znajdujące się na tej stronie :

  1. Ustaw (odkomentuj) log_statement = 'all'i log_min_error_statement = errorwe /var/lib/pgsql/9.2/data/postgresql.conf.
  2. Załaduj ponownie konfigurację PostgreSQL. Dla mnie zostało to wykonane przez uruchomienie /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  3. Znajdź dzisiejsze logowanie /var/lib/pgsql/9.2/data/pg_log/
Zoltán
źródło
4
Nie trzeba ponownie uruchamiać - a pg_ctl reloadjest wystarczające i nie przerywa połączeń. Nie jestem przekonany, że ta odpowiedź dodaje coś do tych, które już tu są.
Craig Ringer
1
@CraigRinger Dzięki za komentarz, to dość ważny fakt. Zaktualizuję odpowiedź, gdy wypróbuję twoją sugestię. Napisałem tę odpowiedź przede wszystkim dla odniesienia, ponieważ wtedy miałem bardzo małe doświadczenie z UNIXem i chciałem mieć wszystkie niezbędne informacje w jednym miejscu (np. Lokalizacje pliku postgresql.conf i pliki dziennika).
Zoltán
0

Należy również ustawić ten parametr, aby rejestrował każdą instrukcję:

log_min_duration_statement = 0
H.Ç.T
źródło
0

Próbowałem ustawić log_statementplik konfiguracyjny Postgres, ale w rzeczywistości plik ten nie został odczytany przez nasz postgres.

Potwierdziłem, że korzystając z żądania:

select *
from pg_settings

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

Używam w ten sposób https://stackoverflow.com/a/41912295/2294168

command: postgres -c config_file=/etc/postgresql.conf
Ser
źródło