2017-06-26 6 views
2

新しいアプリケーションを作成するときに他のエンジニアが複製するPhoenixリポジトリがあります。データベースのないPhoenix Repoでログが多すぎます

私は、そのデータベースが設定される前に、エンジニアは通常生産にフェニックス・サーバを配備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環境変数を設定するには、エンジニアの責任です。エンジニアが最初にクローンを作成するPhoenixアプリテンプレートリポジトリのみを変更できます。

prod.exsを変更する方法はありますか?DATABASE_URLのないアプリでは大量のログが生成されません。

+0

ような何か私はこれが関連している場合は考えているが、私の最高の推測では、max_restartが、ここで0に設定されているので、これが起こるということです。https://github.com/elixir-ecto/db_connection/blob/d0cbabaa0eacd67d3b4cdaa84e2c3082c500f8ac /lib/db_connection/ownership/pool.ex#L11 –

+0

これは、backoff_typeが次のように設定されている場合もあります。 https://github.com/elixir-ecto/ecto/blob/master/lib/ecto/adapters/postgres.ex#L218 –

答えて

0

これは私のロギングシステムはトラブル私の理解では

の取り扱いを持っているログメッセージの膨大な量を生成し、これが最大の問題です。ログシステムを堅牢にするには、おそらくlogrotateを設定する必要があります。そうしないと、遅かれ早かれ問題が発生します。 Erlangは時には非常に冗長かもしれません。

私は、ログのみを抑制

が必要な作業ではありません、私はアーランが組み込まログアップをネジするためのツールを持っている疑いフェニックスアプリのテンプレートリポジトリを変更することができます。私は次のようにあなたがLoggerFileBackendを使用することをお勧め構成:

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

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

データベースが配信されるとすぐに、通常のログ設定でアプリケーションを再デプロイすることがあります。

+0

これはうまくいくが、テンプレートがクローンされた後に私がアプリケーションを制御することはできないので、私はエンジニアにこの変更を依頼する必要があります。可能であれば、できるだけ多くのものを提供することで、人生をよりシンプルにしたいと思っています。 –

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 
+0

私はdistilleryを使ってリリースをパッケージ化していますので、それらのif文は実行時ではなくコンパイル時に実行されると思います。 –

+0

@JesseShieh私は95%がパッケージ化された後でも動作すると確信しています。試してみる。 – stoodfarback

+0

@JesseShieh私はチェックして、うん、あなたは正しい。リリースのために別のフォーマットにコンパイルされます。 – stoodfarback

関連する問題