檢視原始碼 Phoenix.Logger (Phoenix v1.7.14)

量測工具用以處理各種量測事件的紀錄。

量測工具

Phoenix 使用 :telemetry 函式庫進行量測。Phoenix 會發佈以下事件,並附有下列量測和元資料

  • [:phoenix, :endpoint, :init] - Phoenix.Endpoint 在 Endpoint 監督樹成功啟動後,會派送此事件

    • 量測:%{system_time: system_time}
    • 元資料:%{pid: pid(), config: Keyword.t(), module: module(), otp_app: atom()}
    • 停用紀錄:此事件不會被記錄
  • [:phoenix, :endpoint, :start] - 通常在重新載入程式碼後,Endpoint 中的 Plug.Telemetry 會派送此事件

    • 量測:%{system_time: system_time}
    • 元資料:%{conn: Plug.Conn.t, options: Keyword.t}
    • 選項:%{log: Logger.level | false}

    • 停用紀錄:在您的 Endpoint 中使用 plug Plug.Telemetry, ..., log: Logger.level | false

    • 動態設定記錄等級:plug Plug.Telemetry, ..., log: {Mod, Fun, Args}
  • [:phoenix, :endpoint, :stop] - 每當送出回應時,Endpoint 中的 Plug.Telemetry 會派送此事件

    • 量測:%{duration: native_time}
    • 元資料:%{conn: Plug.Conn.t, options: Keyword.t}
    • 選項:%{log: Logger.level | false}

    • 停用紀錄:在您的 Endpoint 中使用 plug Plug.Telemetry, ..., log: Logger.level | false

    • 動態設定記錄等級:plug Plug.Telemetry, ..., log: {Mod, Fun, Args}
  • [:phoenix, :router_dispatch, :start] - 在派送至已匹配的路由之前,Phoenix.Router 會派送此事件

    • 量測:%{system_time: System.system_time}
    • 元資料:%{conn: Plug.Conn.t, route: binary, plug: module, plug_opts: term, path_params: map, pipe_through: [atom], log: Logger.level | false}

    • 停用紀錄:將 log: false 傳遞至路由巨集,例如:get("/page", PageController, :index, log: false)
    • 動態設定記錄等級:get("/page", PageController, :index, log: {Mod, Fun, Args})
  • [:phoenix, :router_dispatch, :exception] - 在派送路由時發生例外的事件後,Phoenix.Router 會派送此事件

    • 量測:%{duration: native_time}
    • 元資料:%{conn: Plug.Conn.t, kind: :throw | :error | :exit, reason: term(), stacktrace: Exception.stacktrace()}

    • 停用紀錄:此事件不會被記錄
  • [:phoenix, :router_dispatch, :stop] - 由 Phoenix.Router 在成功指派匹配的路線後指派

    • 量測:%{duration: native_time}
    • 元資料:%{conn: Plug.Conn.t, route: binary, plug: module, plug_opts: term, path_params: map, pipe_through: [atom], log: Logger.level | false}

    • 停用紀錄:此事件不會被記錄
  • [:phoenix, :error_rendered] - 在呈現錯誤檢視的尾端指派

    • 量測:%{duration: native_time}
    • 中繼資料:%{conn: Plug.Conn.t, status: Plug.Conn.status, kind: Exception.kind, reason: term, stacktrace: Exception.stacktrace}
    • 停用記錄:在終端點設定中設定render_errors: [log: false]
  • [:phoenix, :socket_connected] - Phoenix.Socket 指派,即通訊端連線的尾端

    • 量測:%{duration: native_time}
    • 中繼資料:%{endpoint: atom, transport: atom, params: term, connect_info: map, vsn: binary, user_socket: atom, result: :ok | :error, serializer: atom, log: Logger.level | false}

    • 停用記錄:在終端點中設定 use Phoenix.Socket, log: falsesocket "/foo", MySocket, websocket: [log: false]
  • [:phoenix, :channel_joined] - 即頻道加入的尾端指派

    • 量測:%{duration: native_time}
    • 中繼資料:%{result: :ok | :error, params: term, socket: Phoenix.Socket.t}

    • 停用記錄:此事件無法停用
  • [:phoenix, :channel_handled_in] - 即頻道處理器的尾端指派

    • 量測:%{duration: native_time}
    • 中繼資料:%{event: binary, params: term, socket: Phoenix.Socket.t}
    • 停用記錄:此事件無法停用

若要查看 Phoenix LiveDashboard 如何使用這些事件建立指標的範例,請至 https://hexdocs.dev.org.tw/phoenix_live_dashboard/metrics.html

參數過濾

在記錄參數時,Phoenix 能過濾出敏感的參數,例如:密碼和通行碼。可在 :filter_parameters 選項中新增要過濾的參數

config :phoenix, :filter_parameters, ["password", "secret"]

透過以上的設定,Phoenix 會過濾掉任何包含 passwordsecret 的參數。會根據大小寫進行比對。

Phoenix 的預設值為 ["password"]

Phoenix 可過濾所有參數,並選擇保留的參數。可透過以下方式設定

config :phoenix, :filter_parameters, {:keep, ["id", "order"]}

透過以上的設定,Phoenix 會過濾掉所有參數,但會保留完全符合 idorder 的參數。若任一保留的參數符合,所有巢狀在該參數底下的參數也會保留。

動態記錄層級

在部分情況下,您可能希望能根據每項要求動態設定記錄層級。為執行此動作,請將 :log 選項設定為元組 {Mod, Fun, Args}。請求的 Plug.Conn.t() 會新增於所提供的參數清單之前。

呼叫時,你的函數必須傳回一個 Logger.level()false 來為請求停用記錄。

例如,在你的端點中,你可能會執行類似下列的動作

  # lib/my_app_web/endpoint.ex
  plug Plug.Telemetry,
    event_prefix: [:phoenix, :endpoint],
    log: {__MODULE__, :log_level, []}

  # Disables logging for routes like /status/*
  def log_level(%{path_info: ["status" | _]}), do: false
  def log_level(_), do: :info

停用

在你使用自訂記錄系統時,不總是希望預設啟用 Phoenix.Logger。你總是可以用下列方式在一般情況下停用它

config :phoenix, :logger, false