defmodule Phoenix.LiveDashboard.RequestLoggerPage do @moduledoc false use Phoenix.LiveDashboard.PageBuilder, refresher?: false @menu_text "Request Logger" @impl true def mount(%{"stream" => stream}, session, socket) do %{ request_logger: {param_key, cookie_key}, cookie_domain: cookie_domain } = session if connected?(socket) do # TODO: Remove || once we support Phoenix v1.5+ endpoint = socket.endpoint pubsub_server = endpoint.config(:pubsub_server) || endpoint.__pubsub_server__() Phoenix.PubSub.subscribe(pubsub_server, Phoenix.LiveDashboard.RequestLogger.topic(stream)) end socket = socket |> assign( stream: stream, param_key: param_key, cookie_key: cookie_key, cookie_domain: read_cookie_domain(socket, cookie_domain), cookie_enabled: false, autoscroll_enabled: true, messages_present: false ) |> stream_configure(:messages, dom_id: fn _ -> "log-#{System.unique_integer()}" end) |> stream(:messages, []) {:ok, socket} end def mount(_, %{request_logger: _}, socket) do stream = :crypto.strong_rand_bytes(3) |> Base.url_encode64() to = live_dashboard_path(socket, socket.assigns.page, stream: stream) {:ok, push_navigate(socket, to: to)} end @impl true def menu_link(_, %{dashboard_running?: false}) do :skip end def menu_link(%{request_logger: nil}, _) do {:disabled, @menu_text, "https://hexdocs.pm/phoenix_live_dashboard/request_logger.html"} end def menu_link(_, _) do {:ok, @menu_text} end @impl true def handle_info({:logger, level, message}, socket) do {:noreply, socket |> stream(:messages, [{message, level}]) |> assign(messages_present: true)} end @impl true def handle_event("toggle_cookie", %{"enable" => "true"}, socket) do {:noreply, assign(socket, :cookie_enabled, true)} end def handle_event("toggle_cookie", _params, socket) do {:noreply, assign(socket, :cookie_enabled, false)} end def handle_event("toggle_autoscroll", _params, socket) do {:noreply, assign(socket, :autoscroll_enabled, !socket.assigns.autoscroll_enabled)} end @impl true def render(assigns) do ~H"""
Logs
<%= for {id, {message, level}} <- @streams.messages do %>
<%= message %>
<% end %>
<%= if @param_key do %>
Query Parameter

Access any page with this query parameter:

Copied!
<% end %> <%= if @cookie_key do %>
Cookie Parameter

Create a logger cookie to automatically log requests for the current browser session.

Cookie enabled
<% end %>
Want to refresh the logger parameter? <.link navigate={live_dashboard_path(@socket, @page, [])}> Start a new stream
""" end defp sign(socket, key, value) do Phoenix.LiveDashboard.RequestLogger.sign(socket.endpoint, key, value) end defp read_cookie_domain(socket, :parent) do socket.host_uri.host |> String.split(".", parts: 2) |> List.last() end defp read_cookie_domain(_socket, domain), do: domain end