如何在Heroku与Rails中配置PostgreSQL的client_min_messages
问题
尝试减少Heroku/Rails应用中PostgreSQL的日志噪音,计划将client_min_messages从默认的notice改为warning,但遇到以下问题:
- 在
database.yml中设置min_messages: warning后,Heroku上的PostgreSQL实例无效果,日志仍有NOTICE信息,执行SHOW client_min_messages返回值还是notice - 手动执行
SET client_min_messages TO WARNING;仅对当前会话有效,新会话会重置配置 - 已确认Rails配置中存在该设置:生产控制台执行
Rails.application.config.database_configuration[Rails.env]能看到包含"min_messages"=>"warning"的哈希
日志示例:
Nov 23 15:04:51 my-app-name-production app/postgres.123467 [COLOR] [1234-5] sql_error_code = 00000 log_line="5733" application_name="puma: cluster worker 0: 4 [app]" NOTICE: text-search query contains only stop words or doesn't contain lexemes, ignored
解决方案
方法1:通过Heroku环境变量全局设置
Heroku的PostgreSQL支持通过PGOPTIONS环境变量传递数据库启动参数,这是最可靠的持久化方式:
- 打开终端,执行Heroku CLI命令设置环境变量:
heroku config:set PGOPTIONS="-c client_min_messages=warning" --app your-app-name
- 重启应用使配置生效:
heroku restart --app your-app-name
该配置会对所有新建立的数据库连接生效,无需修改代码或配置文件。
方法2:通过Rails初始化代码设置连接级配置
如果环境变量方法不适用,可以在Rails初始化过程中,为每个新建立的数据库连接设置参数:
- 在
config/initializers目录下创建postgres_client_messages.rb文件 - 添加以下代码:
# 为每个新建立的连接设置client_min_messages ActiveRecord::Base.connected_callback do |connection| connection.execute("SET client_min_messages TO 'warning'") end
- 部署代码到Heroku后,新的数据库连接会自动应用该配置。
说明
Heroku托管的PostgreSQL实例不允许直接修改postgresql.conf文件,因此database.yml中的min_messages配置会被Heroku的数据库连接配置覆盖,这是之前设置无效的原因。
内容的提问来源于stack exchange,提问作者Jaco Pretorius
相关产品推荐
相关产品推荐

