Phoenix.Logger
Исходный кодИнструмент для обработки журналирования различных событий инструментирования.
Инструментирование
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в Endpoint, обычно после перезагрузки кода- Измерение:
%{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]— событие отправляется модулемPlug.Telemetryв Endpoint при отправке ответа- Измерение:
%{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]в конфигурации Endpoint
- Измерение:
-
[: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]в Endpoint
- Измерение:
-
[:phoenix, :socket_drain]— событие отправляется модулемPhoenix.Socketпри использовании параметра:drainer- Измерение:
%{count: integer, total: integer, index: integer, rounds: integer} Метаданные:
%{endpoint: atom, socket: atom, intervasl: integer, log: Logger.level | false}- Отключение журналирования:
use Phoenix.Socket, log: falseв Endpoint или передайте параметр:logв параметре:drainer
- Измерение:
-
[:phoenix, :channel_joined]— событие отправляется в конце присоединения к каналу- Измерение:
%{duration: native_time} Метаданные:
%{result: :ok | :error, params: term, socket: Phoenix.Socket.t}- Отключение журналирования: это событие нельзя отключить
- Измерение:
-
[:phoenix, :channel_handled_in]— событие отправляется в конце обработки handle_in канала- Измерение:
%{duration: native_time} - Метаданные:
%{event: binary, params: term, socket: Phoenix.Socket.t} - Отключение журналирования: это событие нельзя отключить
- Измерение:
Пример использования этих событий в Phoenix LiveDashboard для создания метрик см. на странице https://phoenix-live-dashboard.hexdocs.pm/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
© 2014 Chris McCord
Licensed under the MIT License.
https://phoenix.hexdocs.pm/Phoenix.Logger.html