查看源代码 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] - 由 Plug.Telemetry 在您的端点中派发,通常在代码重新加载后

    • 度量:%{system_time: system_time}
    • 元数据:%{conn: Plug.Conn.t, options: Keyword.t}
    • 选项:%{log: Logger.level | false}

    • 禁用日志:在您的端点 plug Plug.Telemetry, ..., log: Logger.level | false

    • 动态配置日志级别:plug Plug.Telemetry, ..., log: {Mod, Fun, Args}
  • [:phoenix, :endpoint, :stop] - 由 Plug.Telemetry 在您的端点中派发,每当响应发送时

    • 度量:%{duration: native_time}
    • 元数据:%{conn: Plug.Conn.t, options: Keyword.t}
    • 选项:%{log: Logger.level | false}

    • 禁用日志:在您的端点 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.erlang.ac.cn/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 以禁用对该请求的日志记录。

例如,在您的 Endpoint 中,您可以执行以下操作

  # 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