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.Logger从endpoint.ex手动加回需要https://elixirforum.com/t/disable-logging-on-specific-route/622,但后来我不得不小心记得确保为我添加的每个新路由启用了日志记录,而且我真的更喜欢将/ping路由设置为调试,以便它可以根据需要登录dev,但在生产中不会如此垃圾.
在最近版本的 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
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.
您可以定义一个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.Logger与plug MyApp.Logger您的Endpoint模块.所有请求/ping现在:error都将记录在info级别,而其他所有请求都将记录在级别.
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |