【问题标题】:Log the authenticated user in the Postgres logs在 Postgres 日志中记录经过身份验证的用户
【发布时间】:2021-12-28 07:51:58
【问题描述】:

用例 - 需要从 Postgres 日志中的 Python/Flask/Sqlalchemy 记录经过身份验证的用户(不是数据库用户)。

目前我已经使用 postgres.conf 启用了 Postgres 日志,格式如下。

log_line_prefix = 'time=%t, %q db=%d, user=%u, ip=%h, app=%a' 

这将在 postgres.csv 中记录以下格式。

2021-11-17 09:56:18.856 GMT,"db_user_name","database_name",4962,"10.0.0.2:52068",6194d1c2.1362,16,"idle in transaction",2021-11-17 09:56:18 GMT,3/12392,0,LOG,00000,"statement: Query,,,,,,,,,"AppName"

我想到了以下几种方式:

  1. 将用户名动态连接到应用程序名称。
  2. 试图找到向查询添加一些元数据(用户名)的方法。
  3. 编写一个 sql 函数在每个查询之前执行。

我尝试通过以下方式将用户名连接到 app_name。

self.session.bind.url.query.update({'application_name': 'TEST_USERNAME'})
self.engine.url.query.update({'application_name': 'TEST_USERNAME'})

但这并没有反映或更新日志中的应用程序名称。

我还尝试在查询中添加一些元数据,但它也没有反映在日志中。

对于sql函数,我觉得是不必要的开销。

我很想知道是否有人处理这个用例,或者如果有人可以指导我找到解决方案,我会很感激。

【问题讨论】:

    标签: python postgresql flask sqlalchemy


    【解决方案1】:

    你当然可以使用application_name

    您可以在连接字符串中设置该参数,也可以通过运行随时更改该参数

    SET application_name = 'whatever';
    

    SELECT set_config('application_name', 'whatever', FALSE);
    

    【讨论】:

    • 谢谢。使用这种方法,我需要更新 application_name,执行我的查询,恢复 application_name。这种方法的并发性如何?两个用户同时交互时会不会混在一起?
    • 您可以使用set_config(..., ...,TRUE) 仅更改当前事务的参数,它会自动重置。并发不是问题,因为在任何给定时间只能在一个数据库会话上运行一条语句。但也许我误解了。使用连接池,您必须使用事务。
    猜你喜欢
    • 2019-03-20
    • 2021-07-31
    • 2012-07-12
    • 2013-11-19
    • 2011-12-09
    • 2015-06-15
    • 1970-01-01
    • 2020-11-15
    • 2016-01-17
    相关资源
    最近更新 更多