查看源代码 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: false
或socket "/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 将过滤掉包含 password
或 secret
术语的任何参数。匹配区分大小写。
Phoenix 的默认值为 ["password"]
。
Phoenix 可以默认过滤掉所有参数,并有选择地保留参数。可以这样配置
config :phoenix, :filter_parameters, {:keep, ["id", "order"]}
使用上面的配置,Phoenix 将过滤掉所有参数,除了与 id
或 order
完全匹配的参数。如果保留的参数匹配,那么该参数下的所有嵌套参数也将被保留。
动态日志级别
在某些情况下,您可能希望在每个请求的基础上动态设置日志级别。为此,将 :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