我有一个凤凰存储库,其他工程师在创建新应用程序时会克隆。
我在prod.exs
config :foo, Foo.Repo,
adapter: Ecto.Adapters.Postgres,
url: {:system, "DATABASE_URL"},
pool_size: 1
工程师通常在设置数据库之前将凤凰服务器部署到生产中。工程师将在几天之内设置数据库,但与此同时,我的问题是,这会生成大量的日志消息,我的记录系统很难处理。
这是日志消息。
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
环境变量。我只能修改凤凰应用模板存储库。
是否有某种修改prod.exs
的方法,以便没有DATABASE_URL
集的应用不会生成大量日志?
这会生成大量的日志消息,我的记录系统很难处理
在我的理解中,这是最大的问题。您可能需要设置logrotate
以使记录系统稳健,否则,您迟早会遇到问题。Erlang有时可能是冗长的。
我只能修改Phoenix应用模板存储库
抑制日志不是所需的任务,我怀疑Erlang是否有螺钉内置的工具。我建议您使用以下配置使用LoggerFileBackend
:
config :logger,
format: "$date $time [$level] $messagen",
backends: [
{LoggerFileBackend, :stub}
]
config :logger, :stub,
path: "/dev/null",
level: :info
,一旦交付数据库,您就可以使用普通日志设置重新部署该应用程序。
也许为这种情况添加一些处理方法?像
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