我被以下问题阻止了。
服务器上postgres的log_statement设置为ddl(或全部(。数据库是由我的应用程序创建的,它是用C++编写的。查询通过使用libpq-PQexec发送到DB。
每个查询都被记录两次,我不知道为什么(我不是C++程序员,也不是postgres专家(:
Apr 3 02:26:44 xxx postgres[12345]: [8-1] [2020-04-03 02:26:44.487 CDT] [s:xxx.694d] [u:user] [a:[unknown]] [db:postgres] [p:12345] [clnt:[local]] LOG: statement: CREATE USER "gingillo" WITH PASSWORD 'giggio';
Apr 3 02:26:44 xxx postgres[12345]: [9-1] [2020-04-03 02:26:44.487 CDT] [s:xxx.694d] [u:user] [a:[unknown]] [db:postgres] [p:12345] [clnt:[local]] LOG: AUDIT: SESSION,1,1,ROLE,CREATE ROLE,,,"CREATE USER ""gingillo"" WITH PASSWORD <REDACTED>",<not logged>
正如你已经想象的那样,我不想记录密码,所以我更改了当前的查询(1(:
CREATE USER "gingillo" WITH PASSWORD 'giggio'
如下(2(:
BEGIN;SET LOCAL log_statement = 'none';CREATE USER "gingillo" WITH PASSWORD 'giggio';COMMIT;
如果我手动运行查询(2(,我会得到我想要的结果,只记录一个包含REDACTED而不是密码的日志:
Apr 3 02:26:44 xxx postgres[12345]: [9-1] [2020-04-03 02:26:44.487 CDT] [s:xxx.694d] [u:user] [a:[unknown]] [db:postgres] [p:12345] [clnt:[local]] LOG: AUDIT: SESSION,1,1,ROLE,CREATE ROLE,,,"CREATE USER ""gingillo"" WITH PASSWORD <REDACTED>",<not logged>
但是,当C++运行同一个查询时,我有两个日志,甚至显示log_statement内容:
Apr 8 06:44:24 xxx postgres[27171]: [8-1] [2020-04-08 06:44:24.489 CDT] [s:xxx.6a23] [u:user] [a:[unknown]] [db:postgres] [p:27171] [clnt:[local]] LOG: statement: BEGIN;SET LOCAL log_statement = 'none';CREATE USER "gingillo" WITH PASSWORD 'giggio';COMMIT;
Apr 8 06:44:24 xxx postgres[27171]: [9-1] [2020-04-08 06:44:24.490 CDT] [s:xxx.6a23] [u:user] [a:[unknown]] [db:postgres] [p:27171] [clnt:[local]] LOG: AUDIT: SESSION,1,1,ROLE,CREATE ROLE,,,"BEGIN;SET LOCAL log_statement = 'none';CREATE USER ""gingillo"" WITH PASSWORD <REDACTED>",<not logged>
有人知道如何禁用第一个日志吗?我做错了什么?
SET LOCAL
作用域仅用于当前事务。
尝试:
- 要么运行在数据库会话期间持续存在的
SET log_statement=none
,除非发出ROLLBACK - 或者为每个事务运行CCD_ 3
看起来C++代码正在设置log_statement参数:最好的解决方案应该是删除它,因为它已经使用了另一个日志记录。
您正在向PostgreSQL发送一个包含4个实际语句的单个"语句"。当处理"SET LOCAL log_statement='none'"时,由于已经记录了整个多语句语句,因此损坏已经造成。如果你想让其中的一部分影响另一部分的设置,你需要单独发送每个语句。
或者,一开始就避免将log_statement设置为"all",因为这似乎是不必要的。