【问题标题】:Can you set different log levels for different routes in Phoenix?可以在 Phoenix 中为不同的路由设置不同的日志级别吗?
【发布时间】:2018-07-05 02:13:37
【问题描述】:

我有一个 /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

我找到了一种方法,通过从 endpoint.ex 中删除 plug Plug.Logger 并根据需要手动添加回 https://elixirforum.com/t/disable-logging-on-specific-route/622,来完全禁用特定路由的日志记录,但是我必须小心记住以确保日志记录是为我添加的每条新路由启用,实际上我更希望将 /ping 路由设置为调试,以便它可以根据需要登录开发,但在生产中不会那么垃圾。

【问题讨论】:

    标签: logging elixir phoenix-framework


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-13
        • 2021-11-13
        • 1970-01-01
        • 2018-07-10
        相关资源
        最近更新 更多