Logování uživatele v postgres

caveman

Logování uživatele v postgres
« kdy: 29. 09. 2017, 10:46:18 »
Dobrý den,

neřešil jste prosím někdo, jak vypnout logování connection u konkrétního uživatele v postgres? Potřebuji pouze jednomu konkrétnímu userovi vypnout, aby nelogoval události připojení a odpojení k db. Když nastavím log_statement na none, tak se v logu stále zobrazují události o connect/disconnect a potřeboval bych se toho z důvodu celkem častých připojování zbavit, jelikož mi to produkuje poměrně dost událostí a plní zbytečně logy. Ostatním userum to vypnout nemohu, takže global set nemůžu použít.

Zkoušel jsem nastavit userovi log_statement:
ALTER ROLE name SET log_statement='none';

Vypnout log_connections nefunguje:
postgres=# alter role name set log_connections=off;
ERROR:  parameter "log_connections" cannot be set after connection start

Viz log:
Kód: [Vybrat]
2017-09-23 06:25:20 CEST [32208]: [1-1] db=[unknown],user=[unknown] LOG:  connection received: host=[local]
2017-09-23 06:25:20 CEST [32208]: [2-1] db=template1,user=name LOG:  connection authorized: user=name database=template1
2017-09-23 06:25:20 CEST [32208]: [3-1] db=template1,user=name LOG:  disconnection: session time: 0:00:00.004 user=name database=template1 host=[local]
2017-09-23 06:25:20 CEST [32209]: [1-1] db=[unknown],user=[unknown] LOG:  connection received: host=[local]
2017-09-23 06:25:20 CEST [32209]: [2-1] db=template1,user=name LOG:  connection authorized: user=name database=template1
2017-09-23 06:25:20 CEST [32209]: [3-1] db=template1,user=name LOG:  disconnection: session time: 0:00:00.002 user=name database=template1 host=[local]
2017-09-23 06:25:20 CEST [32212]: [1-1] db=[unknown],user=[unknown] LOG:  connection received: host=[local]
2017-09-23 06:25:20 CEST [32212]: [2-1] db=template1,user=name LOG:  connection authorized: user=name database=template1

Případně díky za rady.


Re:Logování uživatele v postgres
« Odpověď #1 kdy: 29. 09. 2017, 12:47:44 »
neřešil jste prosím někdo, jak vypnout logování connection u konkrétního uživatele v postgres? Potřebuji pouze jednomu konkrétnímu userovi vypnout, aby nelogoval události připojení a odpojení k db. Když nastavím log_statement na none, tak se v logu stále zobrazují události o connect/disconnect a potřeboval bych se toho z důvodu celkem častých připojování zbavit, jelikož mi to produkuje poměrně dost událostí a plní zbytečně logy. Ostatním userum to vypnout nemohu, takže global set nemůžu použít.

Podle mě to takto selektivně v postgresu vypnout nejde, je to globální, ne uživatelský parametr. Mělo by však jít posílat logy přes syslog, kde se dá (přinejmenším na rsyslogd) nastavit filtrování podle obsahu.

Pro takto častá připojování bych ale zvážil pooler spojení - ten se směrem k postgresu připojí jen menším počtem spojení, ta neuzavírá. A na druhé straně naslouchá, ale připojení realizuje s menší režií, než přímé připojení do postgresu. Některé poolery umějí i cache přes memcache, samozřejmě to funguje jen v některých případech. Tam, kde nejsou transakce, se spojení dokonce ani neresetuje, dotazy se posílají v rámci téhož. Viz. PgBouncer nebo Pgpool-II. V ten moment do logu postgresu bude padat jen zlomek spojení, a co se rozhodnete udělat s logy pooleru je na Vás - ty můžete klidně zahodit.

Řešení 2 se mi libí víc, protože ušetří i výkon stroje.

caveman

Re:Logování uživatele v postgres
« Odpověď #2 kdy: 02. 10. 2017, 14:46:49 »
Dobrý den,

neřešil jste prosím někdo, jak vypnout logování connection u konkrétního uživatele v postgres? Potřebuji pouze jednomu konkrétnímu userovi vypnout, aby nelogoval události připojení a odpojení k db. Když nastavím log_statement na none, tak se v logu stále zobrazují události o connect/disconnect a potřeboval bych se toho z důvodu celkem častých připojování zbavit, jelikož mi to produkuje poměrně dost událostí a plní zbytečně logy. Ostatním userum to vypnout nemohu, takže global set nemůžu použít.

Zkoušel jsem nastavit userovi log_statement:
ALTER ROLE name SET log_statement='none';

Vypnout log_connections nefunguje:
postgres=# alter role name set log_connections=off;
ERROR:  parameter "log_connections" cannot be set after connection start

Viz log:
Kód: [Vybrat]
2017-09-23 06:25:20 CEST [32208]: [1-1] db=[unknown],user=[unknown] LOG:  connection received: host=[local]
2017-09-23 06:25:20 CEST [32208]: [2-1] db=template1,user=name LOG:  connection authorized: user=name database=template1
2017-09-23 06:25:20 CEST [32208]: [3-1] db=template1,user=name LOG:  disconnection: session time: 0:00:00.004 user=name database=template1 host=[local]
2017-09-23 06:25:20 CEST [32209]: [1-1] db=[unknown],user=[unknown] LOG:  connection received: host=[local]
2017-09-23 06:25:20 CEST [32209]: [2-1] db=template1,user=name LOG:  connection authorized: user=name database=template1
2017-09-23 06:25:20 CEST [32209]: [3-1] db=template1,user=name LOG:  disconnection: session time: 0:00:00.002 user=name database=template1 host=[local]
2017-09-23 06:25:20 CEST [32212]: [1-1] db=[unknown],user=[unknown] LOG:  connection received: host=[local]
2017-09-23 06:25:20 CEST [32212]: [2-1] db=template1,user=name LOG:  connection authorized: user=name database=template1

Případně díky za rady.

neřešil jste prosím někdo, jak vypnout logování connection u konkrétního uživatele v postgres? Potřebuji pouze jednomu konkrétnímu userovi vypnout, aby nelogoval události připojení a odpojení k db. Když nastavím log_statement na none, tak se v logu stále zobrazují události o connect/disconnect a potřeboval bych se toho z důvodu celkem častých připojování zbavit, jelikož mi to produkuje poměrně dost událostí a plní zbytečně logy. Ostatním userum to vypnout nemohu, takže global set nemůžu použít.

Podle mě to takto selektivně v postgresu vypnout nejde, je to globální, ne uživatelský parametr. Mělo by však jít posílat logy přes syslog, kde se dá (přinejmenším na rsyslogd) nastavit filtrování podle obsahu.

Pro takto častá připojování bych ale zvážil pooler spojení - ten se směrem k postgresu připojí jen menším počtem spojení, ta neuzavírá. A na druhé straně naslouchá, ale připojení realizuje s menší režií, než přímé připojení do postgresu. Některé poolery umějí i cache přes memcache, samozřejmě to funguje jen v některých případech. Tam, kde nejsou transakce, se spojení dokonce ani neresetuje, dotazy se posílají v rámci téhož. Viz. PgBouncer nebo Pgpool-II. V ten moment do logu postgresu bude padat jen zlomek spojení, a co se rozhodnete udělat s logy pooleru je na Vás - ty můžete klidně zahodit.

Řešení 2 se mi libí víc, protože ušetří i výkon stroje.
Ten pgbouncer nevypadá jako špatné řešení. Logy v žádném případě zahazovat nemohu, proto to musím řešit nějak jinak a tohle řešení se mi zdá mnohem čistější a ideálnější. Díky za radu.

Re:Logování uživatele v postgres
« Odpověď #3 kdy: 02. 10. 2017, 16:34:01 »
Ten pgbouncer nevypadá jako špatné řešení. Logy v žádném případě zahazovat nemohu, proto to musím řešit nějak jinak a tohle řešení se mi zdá mnohem čistější a ideálnější. Díky za radu.

Pokud dokážete využít i cache, pak je Pgpool-II lepší. Pgbouncer je jednodušší na nastavení. Přeju hodně zdaru!

Re:Logování uživatele v postgres
« Odpověď #4 kdy: 06. 10. 2017, 21:11:16 »
No ja bych se kouknul na ALTER ROLE ... SET parameter;

V PostgreSQL existuje parameter log_min_duration_statement.

# SHOW log_min_duration_statement; -- jeho hodnota je by default nastavena na 0

ALTER ROLE postgres SET log_min_duration_statement=-1; -- timto bys mel zamezit logovani

Je potreba provest relogin, ve stejne session nema efekt...

Mam ted PostgreSQL 10 RC1 a 9.6.4 a nezkousel jsem to na nich, ale na starsich verzich fungovalo. Dej vedet.