【问题标题】:How to log PostgreSQL queries?如何记录 PostgreSQL 查询?
【发布时间】:2010-10-17 20:35:35
【问题描述】:

如何启用 PostgreSQL 8.3 执行的所有 SQL 的日志记录?

已编辑(更多信息) 我改变了这些行:

log_directory = 'pg_log'                    
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'

然后重新启动 PostgreSQL 服务...但没有创建日志... 我使用的是 Windows Server 2003。

有什么想法吗?

【问题讨论】:

  • 这很重要:logging_collector = on
  • 另外,请注意,在某些 GNU/Linux 发行版(例如 Debian Jessie)上,systemctl restart postgresql 可能实际上不会重新启动您配置的 PostgreSQL 服务(我还不明白为什么),因此需要更改配置文件不会被应用。使用pg_ctl(或Debian 上的pg_ctlcluster)更安全。
  • 我刚刚在 Ubuntu 16.04 LTS、PostgreSQL 9.5 和 systemctl reload postgresqlsystemctl restart postgresqlservice postgresql reloadservice postgresql restart 中测试了这个,所有渲染配置更改都有效。
  • 在我的情况下(Win 10 桌面,pg12)我必须使用ALTER DATABASE(如this answer)显式启用实际数据库的日志记录

标签: postgresql logging


【解决方案1】:

在 postgresql 中有一个扩展。它的名字是“pg_stat_statements”。 https://www.postgresql.org/docs/9.4/pgstatstatements.html

基本上你必须稍微改变一下 postgresql.conf 文件:

shared_preload_libraries= 'pg_stat_statements'
pg_stat_statements.track = 'all'

然后你必须登录数据库并运行这个命令:

create extension pg_stat_statements;

它将创建名为“pg_stat_statements”的新视图。在此视图中,您可以看到所有已执行的查询。

【讨论】:

    【解决方案2】:

    我试图在一些 postgres 配置文件中设置log_statement,但实际上我们的 postgres 没有读取该文件。

    我确认使用请求:

    select *
    from pg_settings
    
    [...]
    log_statement   none # That was not the value i was expected for !!!
    

    我用这种方式https://stackoverflow.com/a/41912295/2294168

    command: postgres -c config_file=/etc/postgresql.conf
    

    【讨论】:

      【解决方案3】:

      您还应该设置此参数来记录每条语句:

      log_min_duration_statement = 0
      

      【讨论】:

        【解决方案4】:

        在您的data/postgresql.conf 文件中,将log_statement 设置更改为'all'


        编辑

        查看您的新信息,我想说可能还有其他一些设置需要验证:

        • 确保您已打开 log_destination 变量
        • 确保打开logging_collector
        • 还要确保log_directory 目录已经存在于data 目录中,并且postgres 用户可以对其进行写入。

        【讨论】:

        • 很好奇,这是否意味着除非我重新启动服务器,否则 PostgreSQL 无法启用日志记录?在MySQL中,就是“SET GLOBAL general_log = 'ON';”一样简单
        • 我自己不知道是否有办法使用像 MySQL 这样的 SQL 语句来实现,但您可以向正在运行的服务器发送命令以使用 pg_ctl reload 重新加载配置
        • PostgreSQL 还没有办法通过 SQL 语句更改其参数(截至 9.2)。大多数日志记录参数可以在不完全重新启动服务器的情况下更改,只需执行 pg_ctl reload 即可。但是,更改 logging_collector 需要重新启动。
        • 使用 Postgres 9.4 和新的 ALTER SYSTEM 命令,超级用户可以从 SQL 设置 GUC 参数。
        • 答案中引用的data目录不是它的字面名称;它指的是分配给 PostgreSQL 配置文件中的data_directory 变量的路径。在 Debian 和 Ubuntu GNU/Linux 上,此文件通常位于 /etc/postgresql/$v/main/postgresql.conf,其中 $v 是服务器版本。此外,在上述系统上,当log_destination = 'stderr' 时,输出将写入/var/log/postgresql/postgresql-$v-main.log,其中$v 是服务器版本(而不是data_directory 内的某个位置)。
        【解决方案5】:

        仅供参考:其他解决方案只会记录默认数据库中的语句(通常是postgres)来记录其他人;从他们的解决方案开始;那么:

        ALTER DATABASE your_database_name
        SET log_statement = 'all';
        

        参考:https://serverfault.com/a/376888 / log_statement

        【讨论】:

        • 这应该是公认的答案——唯一有实用价值的答案!
        • 引用的语句在 Postgres 9.4 或更高版本中有效,但开头的段落是错误的。为各自的数据库集群在postgresql.conf 中设置log_statement = all - 正如接受的答案所暗示的那样 - 会影响该集群的所有 数据库 - 这可以被每个数据库的设置所推翻。
        • 重新连接psql生效。
        【解决方案6】:

        编辑您的/etc/postgresql/9.3/main/postgresql.conf,并按如下方式更改行。

        注意:如果您没有找到postgresql.conf 文件,则只需在终端中输入$locate postgresql.conf

        1. #log_directory = 'pg_log' log_directory = 'pg_log'

        2. #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

        3. #log_statement = 'none' log_statement = 'all'

        4. #logging_collector = off logging_collector = on

        5. 可选SELECT set_config('log_statement', 'all', true);

        6. sudo /etc/init.d/postgresql restart sudo service postgresql restart

        7. 在 postgresql 中触发查询 select 2+2

        8. 查找当前登录/var/lib/pgsql/9.2/data/pg_log/

        随着时间的推移,日志文件往往会增长很多,并且可能会杀死您的机器。为了您的安全,请编写一个 bash 脚本来删除日志并重新启动 postgresql 服务器。

        感谢@paul、@Jarret Hardie、@Zoltán、@Rix Beck、@Latif Premani

        【讨论】:

        • 在 debian 拉伸上,我还必须在配置文件中取消注释 # log_destination = 'stderr' 才能工作。
        • 我已仔细按照您的步骤进行操作,但它不起作用。需要重启吗?
        • 如果您不想编写 bash 脚本,但只想每月覆盖日志,请执行以下操作:log_filename = 'postgresql-%d.log' 并且不会在每次重启后覆盖,它会每天追加并覆盖每个月。当然,根据 28、29、30、31 月份,会有不同的日子——但你明白了。
        • 我发现你可以从 Postgres 9.0 开始运行 select pg_reload_config();,而不是在第 6 步中重新启动服务。
        【解决方案7】:

        您还需要在 PostgreSQL 中添加这些行并重新启动服务器:

        log_directory = 'pg_log'                    
        log_filename = 'postgresql-dateformat.log'
        log_statement = 'all'
        logging_collector = on
        

        【讨论】:

        • logging_collector=on 是必要的
        • 像魅力一样工作。我对配置文件上的注释说 Required to be on for csvlogs 感到困惑,认为这个选项是记录查询输出而不仅仅是语句,但事实并非如此。
        • 在您的 data/postgresql.conf 文件中,将 log_statement 设置更改为“全部”。
        【解决方案8】:

        根据on this web page 找到的说明,了解运行 PostgreSQL 9.2 的 CentOS 6.4 (Red Hat 4.4.7-3) 的更多详细信息:

        1. /var/lib/pgsql/9.2/data/postgresql.conf 中设置(取消注释)log_statement = 'all'log_min_error_statement = error
        2. 重新加载 PostgreSQL 配置。对我来说,这是通过运行 /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/ 完成的。
        3. 找到今天的登录/var/lib/pgsql/9.2/data/pg_log/

        【讨论】:

        • 您不需要重新启动 - pg_ctl reload 就足够了,并且不会中断连接。不相信这个答案会给已经在这里的人增加任何东西。
        • @CraigRinger 感谢您的评论,这是一个非常重要的事实。尝试过您的建议后,我将更新答案。我写这个答案主要是为了给自己参考,因为当时我对 UNIX 的经验很少,我想把所有必要的信息放在一个地方(例如 postgresql.conf 和日志文件的位置)。跨度>
        【解决方案9】:
        SELECT set_config('log_statement', 'all', true);
        

        具有相应的用户权限可以在连接后使用上面的查询。这将影响日志记录,直到会话结束。

        【讨论】:

        • 使用SET log_statement = 'all' 或(对于事务级别)SET LOCAL log_statement = 'all' 通常更简洁。您可能还对client_min_messageslog_min_messages 设置感兴趣。
        • 这很好,因为我只想记录我的连接消息。不幸的是,我得到:permission denied to set parameter "log_statement",因为我的用户不是超级用户。
        • 您可以要求数据库管理员授予执行该功能的权限。 GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
        【解决方案10】:

        +1 以上答案。我使用以下配置

        log_line_prefix = '%t %c %u ' # time sessionid user
        log_statement = 'all'
        

        【讨论】:

          【解决方案11】:

          log_statement 设置为all

          Error Reporting and Logging - log_statement

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-21
            • 2021-05-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多