From ec03a03cf5d502a68d56fbcdbeed310142089736 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Thu, 5 Mar 2026 08:22:48 -0600 Subject: [PATCH] fix: completely silence logs for noisy health check endpoints Created FilterNoisyLogs plug that disables Phoenix logging for both request and response logs by setting conn.private.phoenix_log to false. This prevents both: - Initial request log (Plug.Telemetry) - Response log (Phoenix.Logger "Sent 200 in Xms") Filters: - GET /health (Kubernetes probes) - HEAD / (external uptime monitors) --- lib/towerops_web/endpoint.ex | 11 ++------ lib/towerops_web/plugs/filter_noisy_logs.ex | 28 +++++++++++++++++++++ 2 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 lib/towerops_web/plugs/filter_noisy_logs.ex diff --git a/lib/towerops_web/endpoint.ex b/lib/towerops_web/endpoint.ex index cbefd4e4..f9abc19c 100644 --- a/lib/towerops_web/endpoint.ex +++ b/lib/towerops_web/endpoint.ex @@ -51,12 +51,11 @@ defmodule ToweropsWeb.Endpoint do plug Plug.RequestId plug ToweropsWeb.Plugs.RemoteIpLogger + plug ToweropsWeb.Plugs.FilterNoisyLogs plug ToweropsWeb.Plugs.BruteForceProtection plug ToweropsWeb.Plugs.SecurityHeaders - plug Plug.Telemetry, - event_prefix: [:phoenix, :endpoint], - log: {__MODULE__, :log_level, []} + plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint] plug Plug.Parsers, parsers: [:urlencoded, :multipart, :json], @@ -91,10 +90,4 @@ defmodule ToweropsWeb.Endpoint do plug Plug.Head plug Plug.Session, @session_options plug ToweropsWeb.Router - - # Disable logging for health check endpoint to reduce log noise from K8s probes - def log_level(%{path_info: ["health"]}), do: false - # Disable logging for HEAD requests to root path (external uptime monitors) - def log_level(%{method: "HEAD", path_info: []}), do: false - def log_level(_), do: :info end diff --git a/lib/towerops_web/plugs/filter_noisy_logs.ex b/lib/towerops_web/plugs/filter_noisy_logs.ex new file mode 100644 index 00000000..41b71ee4 --- /dev/null +++ b/lib/towerops_web/plugs/filter_noisy_logs.ex @@ -0,0 +1,28 @@ +defmodule ToweropsWeb.Plugs.FilterNoisyLogs do + @moduledoc """ + Disables Phoenix logging for noisy endpoints that don't need to be logged. + + This prevents both the initial request log (via Plug.Telemetry) and the + response log (via Phoenix.Logger) by setting conn.private.phoenix_log to false. + + Currently filters: + - GET /health (Kubernetes health checks) + - HEAD / (external uptime monitors) + """ + import Plug.Conn + + def init(opts), do: opts + + def call(conn, _opts) do + if should_filter?(conn) do + # Setting phoenix_log to false prevents Phoenix.Logger from logging this request + put_private(conn, :phoenix_log, false) + else + conn + end + end + + defp should_filter?(%{method: "GET", path_info: ["health"]}), do: true + defp should_filter?(%{method: "HEAD", path_info: []}), do: true + defp should_filter?(_), do: false +end