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

时间:2018-01-25 18:21:29

标签: 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

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

[info] GET /ping
[debug] GET /ping

我找到了一种方法来完全禁用特定路由的日志记录,方法是从plug Plug.Logger删除endpoint.ex并根据需要手动添加https://elixirforum.com/t/disable-logging-on-specific-route/622,但我必须是小心记住确保为我添加的每个新路由启用了日志记录,而且我真的更喜欢将/ping路由设置为debug以便它可以根据需要登录dev,但赢了&#39生产中是如此垃圾。

2 个答案:

答案 0 :(得分:5)

您可以为不同路径定义一个调用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

现在用plug Plug.Logger模块中的plug MyApp.Logger替换Endpoint。对/ping的所有请求现在都会以:error级别登录,而其他所有请求都会以info级别登录。

答案 1 :(得分:2)

在Phoenix的最新版本中,Phoenix.Logger现在响应Plug.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

然后替换

  plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint]

使用

  plug MyWeb.Plugs.Telemetry, event_prefix: [:phoenix, :endpoint]

在您的endpoint.ex中。