Phoenix Repo без базы данных генерирует слишком много логов

У меня есть хранилище 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, которое инженер клонирует в начале.

Есть ли способ изменить prod.exs так что приложение без DATABASE_URL набор не генерирует тонны журналов?

2 ответа

это генерирует огромный объем сообщений журнала, которые моя система регистрации имеет проблемы с обработкой

В моем понимании это самая большая проблема. Вам, вероятно, нужно установить logrotate чтобы сделать систему регистрации надежной, иначе рано или поздно у вас возникнут проблемы. Erlang может быть довольно многословным иногда.

Я могу изменить только хранилище шаблонов приложения Phoenix

Подавление журналов не является желаемой задачей, и я сомневаюсь, что в Erlang есть встроенные инструменты для входа в систему. Я бы посоветовал вам использовать LoggerFileBackend со следующей конфигурацией:

config :logger,
  format: "$date $time [$level] $message\n",
  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
Другие вопросы по тегам