如何在PostgreSQL日志中区分用户直接执行的查询与内部查询
区分PostgreSQL用户查询与内部/系统查询的方法
你当前配置的log_statement='all'、log_min_duration_statement=0会记录数据库收到的所有执行语句,可通过以下几种方法区分用户直接执行的查询和工具内部自动生成的查询:
- 利用application_name字段区分
首先修改postgresql.conf中的log_line_prefix参数,添加%a占位符输出应用名称,示例配置如下:
log_line_prefix = '%t [%p]: [%l] user=%u,db=%d,app=%a '
重载配置生效后,每条日志都会输出对应连接的应用名称:pgAdmin等工具的内部查询会自带pgAdmin标识的应用名,psql客户端执行的查询会显示psql,自定义业务应用的查询会显示你代码中配置的应用名,直接按该字段过滤即可。
- 过滤系统模式访问语句
绝大多数工具内部查询都是为了获取数据库元信息,只会访问pg_catalog、information_schema这类系统内置模式,你可以直接过滤日志中包含pg_catalog.、information_schema.关键字的语句,这类语句基本都不是用户手动执行的业务查询。 - 按执行用户过滤
如果你的业务查询统一使用指定的普通数据库用户执行,而pgAdmin等管理工具使用独立的超级用户(如postgres)连接,可以直接根据日志中的用户字段过滤,排除管理工具使用的用户执行的所有语句即可。 - 从源头关闭内部查询日志
如果不需要保留内部查询的日志,可以直接给管理工具使用的独立用户单独设置日志参数,避免这类语句被记录:
ALTER ROLE 你的pgAdmin连接用户名 SET log_statement = 'none';
执行后该用户的所有执行语句都不会被写入日志,不需要再手动筛选。
内容的提问来源于stack exchange,提问作者Oto Shavadze
相关产品推荐
相关产品推荐

