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