phoenixframework / phoenix

Peace of mind from prototype to production
https://www.phoenixframework.org
MIT License
21.24k stars 2.87k forks source link

LoggerFileBackend not available/loading in 1.7.0-rc.1 (and rc.0) #5213

Closed fullstackdude closed 1 year ago

fullstackdude commented 1 year ago

Environment

Expected behavior

Logging to file is expected to work. Config is as follows...

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

config :logger, :error_log, path: "/var/log/myapp/error.log", level: :debug

The config was placed first in config.exs, then moved to prod.exs, with the same error result from both.

This is a very simple function and config, so perhaps something has changed in the config, etc? Not finding anything at SO or irc. If something has changed and you explain it I am more than happy to update the documentation. Thank you.

Actual behavior

App crashes with core dump, console shows following error both in dev and prod:

                      {supervisor,init_children,2,
                           [{file,"supervisor.erl"},{line,350}]}]}}}},
         {'Elixir.Logger.App',start,[normal,[]]}}
type: temporary

(Mix) Could not start application logger: Logger.App.start(:normal, []) returned an error: shutdown: failed to start child: Logger.BackendSupervisor (EXIT) an exception was raised: (RuntimeError) EXIT when installing backend {LoggerFileBackend, :error_log}: an exception was raised: (UndefinedFunctionError) function LoggerFileBackend.init/1 is undefined (module LoggerFileBackend is not available) LoggerFileBackend.init({LoggerFileBackend, :error_log}) (stdlib 4.2) gen_event.erl:698: :gen_event.server_add_handler/4 (stdlib 4.2) gen_event.erl:544: :gen_event.handle_msg/6 (stdlib 4.2) proc_lib.erl:240: :proc_lib.init_p_do_apply/3 (logger 1.14.1) lib/logger/backend_supervisor.ex:19: anonymous fn/2 in Logger.BackendSupervisor.start_link/1 (elixir 1.14.1) lib/enum.ex:2468: Enum."-reduce/3-lists^foldl/2-0-"/3 (logger 1.14.1) lib/logger/backend_supervisor.ex:13: Logger.BackendSupervisor.start_link/1 (stdlib 4.2) supervisor.erl:414: :supervisor.do_start_child_i/3 (stdlib 4.2) supervisor.erl:400: :supervisor.do_start_child/2 (stdlib 4.2) supervisor.erl:384: anonymous fn/3 in :supervisor.start_children/2 (stdlib 4.2) supervisor.erl:1250: :supervisor.children_map/4 (stdlib 4.2) supervisor.erl:350: :supervisor.init_children/2

Mix.exs is as follows...

defmodule Myapp.MixProject do use Mix.Project

def project do [ app: :myapp, version: "0.1.0", elixir: "~> 1.14", elixirc_paths: elixirc_paths(Mix.env()), start_permanent: Mix.env() == :prod, aliases: aliases(), deps: deps() ] end

Configuration for the OTP application.

#

Type mix help compile.app for more information.

def application do [ mod: {Myapp.Application, []}, extra_applications: [:logger, :runtime_tools] ] end

Specifies which paths to compile per environment.

defp elixirc_paths(:test), do: ["lib", "test/support"] defp elixircpaths(), do: ["lib"]

Specifies your project dependencies.

#

Type mix help deps for examples and options.

defp deps do [ {:phoenix, "~> 1.7.0-rc.1", override: true}, {:phoenix_ecto, "~> 4.4"}, {:ecto_sql, "~> 3.6"}, {:postgrex, ">= 0.0.0"}, {:phoenix_html, "~> 3.0"}, {:phoenix_live_reload, "~> 1.2", only: :dev}, {:phoenix_live_view, "~> 0.18.3"}, {:heroicons, "~> 0.5"}, {:floki, ">= 0.30.0", only: :test}, {:phoenix_live_dashboard, "~> 0.7.2"}, {:esbuild, "~> 0.5", runtime: Mix.env() == :dev}, {:tailwind, "~> 0.1.8", runtime: Mix.env() == :dev}, {:swoosh, "~> 1.3"}, {:finch, "~> 0.13"}, {:telemetry_metrics, "~> 0.6"}, {:telemetry_poller, "~> 1.0"}, {:gettext, "~> 0.20"}, {:jason, "~> 1.2"}, {:plug_cowboy, "~> 2.5"} ] end

Aliases are shortcuts or tasks specific to the current project.

For example, to install project dependencies and perform other setup tasks, run:

#

$ mix setup

#

See the documentation for Mix for more info on aliases.

defp aliases do [ setup: ["deps.get", "ecto.setup"], "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"], "ecto.reset": ["ecto.drop", "ecto.setup"], test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"], "assets.deploy": ["tailwind default --minify", "esbuild default --minify", "phx.digest"] ] end end

josevalim commented 1 year ago

Can you please specify a small application that reproduces the error?

The error doesn't mention Phoenix and may be unrelated to it.

Also note that you may be configuring the Logger too early, so something is trying to use it, and it has not been compiled it. You should probably add it on your Application.start callback. Note you also don't need a separate dep for this, please see: https://elixirforum.com/t/logging-to-disk-with-rotation/53026

TwistingTwists commented 1 year ago

It is likely that logger_file_backend has to be added in applications and has not been mentioned.

def application do
    [applications: [
      ...,
      :logger_file_backend,
      ...
      ]
    ]
end

As given in documentation.

josevalim commented 1 year ago

Closing. Please let us know if we can reproduce it.