我有一个/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生产中是如此垃圾。
答案 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
中。