你能为凤凰城的不同路线设置不同的日志级别吗?

mmr*_*ins 5 logging elixir phoenix-framework

我有一条/ping通过负载均衡器和kubernetes运行状况检查在生产中被调用的路由.我想将日志级别设置Plug.Logger:debug仅适用于该路由.

defmodule Web.Endpoint do
  ...
  forward "/ping", Web.HealthCheck
  ...
end

defmodule Web.HealthCheck do
  use Plug.Router

  plug :match
  plug :dispatch

  get "/" do
    send_resp(conn, 200, "ok")
  end
end
Run Code Online (Sandbox Code Playgroud)

我没有找到修改或删除现有插件的方法.我尝试添加plug Plug.Logger, log: :debug到Web.HealthCheck,但后来我只是在不同的级别上记录了两次

[info] GET /ping
[debug] GET /ping
Run Code Online (Sandbox Code Playgroud)

我已经找到了一种方法来禁用完全是为一个特定的路线记录除去plug Plug.Loggerendpoint.ex手动加回需要https://elixirforum.com/t/disable-logging-on-specific-route/622,但后来我不得不小心记得确保为我添加的每个新路由启用了日志记录,而且我真的更喜欢将/ping路由设置为调试,以便它可以根据需要登录dev,但在生产中不会如此垃圾.

Ilj*_*ilä 8

在最近版本的 Phoenix 中,看起来特定日志现在是Phoenix.LoggerPlug.Telemetry. 抑制特定路由的方式与Plug.Logger. 要么创建一个完全不包含遥测的单独端点/管道,要么提供插件的自定义实现,以更改某些路径的日志级别:

defmodule MyWeb.Plugs.Telemetry do
  @behaviour Plug

  @impl true
  def init(opts), do: Plug.Telemetry.init(opts)

  @impl true
  def call(%{path_info: ["ping"]} = conn, {start_event, stop_event, opts}) do
    Plug.Telemetry.call(conn, {start_event, stop_event, Keyword.put(opts, :log, :debug)})
  end
  def call(conn, args), do: Plug.Telemetry.call(conn, args)
end
Run Code Online (Sandbox Code Playgroud)

然后更换

  plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint]
Run Code Online (Sandbox Code Playgroud)

  plug MyWeb.Plugs.Telemetry, event_prefix: [:phoenix, :endpoint]
Run Code Online (Sandbox Code Playgroud)

在您的endpoint.ex.


Dog*_*ert 6

您可以定义一个Plug.Logger针对不同路径使用不同级别调用的插件.

defmodule MyApp.Logger do
  def init(_opts), do: {}

  def call(%{path_info: ["ping"]} = conn, _opts) do
    Plug.Logger.call(conn, :error)
  end
  def call(conn, _opts) do
    Plug.Logger.call(conn, :info)
  end
end
Run Code Online (Sandbox Code Playgroud)

现在替换plug Plug.Loggerplug MyApp.Logger您的Endpoint模块.所有请求/ping现在:error都将记录在info级别,而其他所有请求都将记录在级别.