没有数据库的Phoenix Repo会生成太多日志

时间:2017-06-26 22:58:58

标签: elixir phoenix-framework ecto supervisor postgrex

我有一个其他工程师在创建新应用时克隆的Phoenix存储库。

我在prod.exs

中有以下内容
config :foo, Foo.Repo,
  adapter: Ecto.Adapters.Postgres,
  url: {:system, "DATABASE_URL"},
  pool_size: 1

工程师通常在设置数据库之前将Phoenix服务器部署到生产环境。工程师将在几天内设置数据库,但与此同时我的问题是,这会产生大量日志消息,我的日志系统无法处理。

这是日志消息。

15:48:29.496 [error] GenServer #PID<0.20959.1> terminating
** (KeyError) key :database not found in: [hostname: "localhost", username: "foo", types: Ecto.Adapters.Postgres.TypeModule, port: 5432, name: Foo.Repo.Pool, otp_app: :foo, repo: Foo.Repo, adapter: Ecto.Adapters.Postgres, pool_size: 1, pool_timeout: 5000, timeout: 15000, adapter: Ecto.Adapters.Postgres, url: {:system, "DATABASE_URL"}, pool_size: 1, pool: DBConnection.Poolboy]
    (elixir) lib/keyword.ex:333: Keyword.fetch!/2
    (postgrex) lib/postgrex/protocol.ex:76: Postgrex.Protocol.connect/1
    (db_connection) lib/db_connection/connection.ex:134: DBConnection.Connection.connect/2
    (connection) lib/connection.ex:622: Connection.enter_connect/5
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
15:48:29.496 [error] GenServer #PID<0.20960.1> terminating
** (KeyError) key :database not found in: [hostname: "localhost", username: "foo", types: Ecto.Adapters.Postgres.TypeModule, port: 5432, name: Foo.Repo.Pool, otp_app: :foo, repo: Foo.Repo, adapter: Ecto.Adapters.Postgres, pool_size: 1, pool_timeout: 5000, timeout: 15000, adapter: Ecto.Adapters.Postgres, url: {:system, "DATABASE_URL"}, pool_size: 1, pool: DBConnection.Poolboy]
    (elixir) lib/keyword.ex:333: Keyword.fetch!/2
    (postgrex) lib/postgrex/protocol.ex:76: Postgrex.Protocol.connect/1
    (db_connection) lib/db_connection/connection.ex:134: DBConnection.Connection.connect/2
    (connection) lib/connection.ex:622: Connection.enter_connect/5
    (stdlib) proc_lib.erl:247: :proc_lib.init_p_do_apply/3
15:48:29.497 [error] GenServer #PID<0.20961.1> terminating

我知道如何修复错误,但最终设置DATABASE_URL环境变量是工程师的责任。我只能修改工程师在开始时克隆的Phoenix app模板库。

是否有某种方法可以修改prod.exs,以便没有设置DATABASE_URL的应用不会生成大量日志?

2 个答案:

答案 0 :(得分:0)

  

这会生成大量日志消息,我的日志记录系统无法处理

据我了解,这是最大的问题。您可能需要设置logrotate以使日志记录系统健壮,否则,迟早会遇到问题。 Erlang有时可能很冗长。

  

我只能修改Phoenix app模板库

抑制日志不是理想的任务,我怀疑Erlang是否有工具可以阻止内置的日志记录。我建议您使用LoggerFileBackend进行以下配置:

config :logger,
  format: "$date $time [$level] $message\n",
  backends: [
    {LoggerFileBackend, :stub}
  ]

config :logger, :stub,
  path: "/dev/null",
  level: :info

一旦交付数据库,您可以使用正常的日志设置重新部署应用程序。

答案 1 :(得分:0)

也许为这种情况添加一些处理?像

这样的东西
database_url = System.get_env("DATABASE_URL")
if database_url do
  config :foo, Foo.Repo,
    adapter: Ecto.Adapters.Postgres,
    url: database_url,
    pool_size: 1
else
  # Maybe fail, maybe log an error, maybe have a dummy db?
end