【问题标题】:How do I make queries made by JDBC show up in postgres logs?如何使 JDBC 进行的查询显示在 postgres 日志中?
【发布时间】:2020-04-10 12:07:16
【问题描述】:

我正在使用 Postgres 作为数据库的 Spring Boot 服务器。我希望能够拥有来自服务器的查询的日志文件。我找到了我的 sql 日志,我可以看到我通过 psql 对数据库进行的查询,但是没有记录来自我的服务器通过 jdbc 的查询。如何让这些查询显示在我的日志文件中?或者,如果他们只是被记录在其他地方,有人能指出我正确的方向吗?

【问题讨论】:

  • 记录到 Postgres 日志的查询不因应用程序而异——您能否在您的 SHOW ALL 输出中使用 log_min_duration_statementlog_statement 的值更新您的帖子(从 @ 运行 SHOW ALL 987654327@)。请同时显示与log_*相关的其他参数
  • 我添加了一张带有日志值的图片
  • 为什么不在 Spring Boot 应用程序日志中记录 SQL 调用?喜欢:logging.level.org.hibernate.SQL=DEBUG
  • 我已经在这样做了。问题是某个查询没有返回结果集,但是当我将它从服务器日志复制粘贴到 psql 时它可以工作。我希望能够查看 postgres 发布的日志,以了解数据库方面发生了什么。

标签: java database postgresql spring-boot jdbc


【解决方案1】:

您可以将 log_min_duration_statement 设置为 0 以记录所有语句。不过要小心,因为这会大大增加日志的大小。

在 jdbc 连接 url 中设置应用程序名称也很有帮助,这样更容易挑选出适当的日志消息:

jdbc:postgresql://host:5432/DB?ApplicationName=YourApp

【讨论】:

    【解决方案2】:

    如果log_statement=all 来自您的 postgresql.conf 文件,但有时似乎无效,则该设置可能已在数据库或用户级别被覆盖。在发出“SHOW ALL”之前,请确保您连接到同一个数据库,并且与您的应用服务器连接的用户相同。

    它们可能会被以下之一覆盖:

    alter user <foo> set log_statements='none';
    alter database <foo> set log_statements='none';
    

    但是,为了确保用户无法向超级用户隐藏他们的活动,只有超级用户可以发出上述其中一项。如果您的应用以超级用户身份登录(不是一个好主意),那么它可能会在会话级别关闭日志记录,从而覆盖 conf 文件。

    如果是上述命令之一更改了设置,您可以在 psql 中使用 \drds 来查看它,或者在 SQL 中使用:

    SELECT rolname AS "Role", datname AS "Database",
    pg_catalog.array_to_string(setconfig, E'\n') AS "Settings"
    FROM pg_catalog.pg_db_role_setting s
    LEFT JOIN pg_catalog.pg_database d ON d.oid = setdatabase
    LEFT JOIN pg_catalog.pg_roles r ON r.oid = setrole
    ORDER BY 1, 2;
    

    【讨论】:

    • 如果我使用 postgres 控制台从 intellij 运行 show all,我可以看到日志级别设置为与我的 postgresql.conf 不同的东西。知道在哪里可以找到 jdbc 连接时正在使用的配置吗?
    【解决方案3】:

    为了获取每个查询的日志,我将选项log_statement=all 配置为命令行参数,用于postgres 进程。我使用以下 docker compose 文件在开发环境中运行 postgresql 数据库。

    version: "3.8"
    
    services:
    
      db-ct:
        container_name: 'my-container-name'
        image: 'postgres:13'
        environment:
          - POSTGRES_USER=database-username-created-on-container-creation
          - POSTGRES_PASSWORD=database-password-created-on-container-creation
          - POSTGRES_DB=database-name-created-on-container-creation
        ports:
          # The port is available by sql clients, like sqldeveloper
          - '5000:5432'
        volumes:
          - db:/var/lib/postgresql/data/
        restart: 'no'
        # Run postgres and log all queries
        command: [ "postgres", "-c", "log_statement=all" ]
        networks:
          internal:
    
    volumes:
      # Database files
      # They are stored in a volume thus they are not reset after rebuilding the images
      db:
        name: your-volume-name
    
    networks:
      internal:
    

    第 19 行:命令行参数

    需要 4 次替换:my-container-namedatabase-username-created-on-container-creationdatabase-password-created-on-container-creationdatabase-name-created-on-container-creationyour-volume-name

    数据库将侦听端口 5000。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 2011-05-01
      • 2022-12-02
      • 2015-10-07
      相关资源
      最近更新 更多