diff --git a/lib/logster.ex b/lib/logster.ex index 560e139..5c03c48 100644 --- a/lib/logster.ex +++ b/lib/logster.ex @@ -123,6 +123,7 @@ defmodule Logster do extra_fields: Application.get_env(:logster, :extra_fields, []), excludes: Application.get_env(:logster, :excludes, []), renames: Application.get_env(:logster, :renames, []), + filter_headers: Application.get_env(:logster, :filter_headers, []), filter_parameters: Application.get_env(:logster, :filter_parameters, @default_filter_parameters) } @@ -165,6 +166,7 @@ defmodule Logster do # add items in reverse order of how we want them to appear in the log message. [] |> maybe_put_duration(duration_us, log_config) + |> maybe_put_filter_headers(conn, log_config) |> maybe_put_headers(conn, log_config) |> maybe_put_status(conn, log_config) |> maybe_put_query(conn, log_config) @@ -191,6 +193,17 @@ defmodule Logster do microseconds / 1000 end + defp maybe_put_filter_headers(fields, _conn, %{filter_headers: []}), do: fields + + defp maybe_put_filter_headers(fields, conn, %{filter_headers: filter_headers}) do + headers = + conn.req_headers + |> Enum.reject(fn {k, _} -> Enum.member?(filter_headers, k) end) + |> Enum.into(%{}, fn {k, v} -> {k, v} end) + + fields |> Keyword.put(:headers, headers) + end + defp maybe_put_headers(fields, _conn, %{headers: []}), do: fields defp maybe_put_headers(fields, conn, %{headers: log_headers}) do diff --git a/test/logster/plug_test.exs b/test/logster/plug_test.exs index 4927d66..24154e0 100644 --- a/test/logster/plug_test.exs +++ b/test/logster/plug_test.exs @@ -282,4 +282,31 @@ defmodule Logster.PlugTest do refute headers["my-header-two"] refute headers["my-header-three"] end + + @tag with_config: [filter_headers: ["my-header-one"]] + test "[String] log headers with filtering by key" do + message = + conn(:post, "/hello/world", []) + |> put_req_header("my-header-one", "test-value-1") + |> put_req_header("my-header-two", "test-value-2") + |> call_and_capture_log(MyPlug) + + refute message =~ ~s("test-value-1") + assert message =~ ~s("test-value-2") + end + + @tag with_config: [ + headers: ["my-header-one", "my-header-two"], + filter_headers: ["my-header-one"] + ] + test "[String] log only specified headers even with filter_headers settings" do + message = + conn(:post, "/hello/world", []) + |> put_req_header("my-header-one", "test-value-1") + |> put_req_header("my-header-two", "test-value-2") + |> call_and_capture_log(MyPlug) + + assert message =~ ~s("test-value-1") + assert message =~ ~s("test-value-2") + end end diff --git a/test/logster_test.exs b/test/logster_test.exs index d4674ea..4d710e4 100644 --- a/test/logster_test.exs +++ b/test/logster_test.exs @@ -945,6 +945,22 @@ defmodule Logster.Test do assert {:headers, %{"host" => "example.com", "accept" => "text/html"}} in fields end + @tag with_config: [filter_headers: ["content-type"]] + test "adds all the headers excluding specified" do + fields = + %Plug.Conn{ + state: :set_chunked, + req_headers: [ + {"content-type", "application/json"}, + {"host", "example.com"}, + {"accept", "text/html"} + ] + } + |> Logster.get_conn_fields(0) + + assert {:headers, %{"host" => "example.com", "accept" => "text/html"}} in fields + end + @tag with_config: [extra_fields: [:host]] test "includes host when enabled in config" do fields =