diff --git a/lib/plug/request_id.ex b/lib/plug/request_id.ex index 66e1116a..7aaffc22 100644 --- a/lib/plug/request_id.ex +++ b/lib/plug/request_id.ex @@ -47,6 +47,13 @@ defmodule Plug.RequestId do plug Plug.RequestId, assign_as: :plug_request_id + * `:logger_metadata_key` - The name of the key that will be used to store the + discovered or generated request id in `Logger` metadata. If not provided, + the request ID Logger metadata will be stored as `:request_id`. *Available + since v1.18.0*. + + plug Plug.RequestId, logger_metadata_key: :my_request_id + """ require Logger @@ -57,15 +64,16 @@ defmodule Plug.RequestId do def init(opts) do { Keyword.get(opts, :http_header, "x-request-id"), - Keyword.get(opts, :assign_as) + Keyword.get(opts, :assign_as), + Keyword.get(opts, :logger_metadata_key, :request_id) } end @impl true - def call(conn, {header, assign_as}) do + def call(conn, {header, assign_as, logger_metadata_key}) do request_id = get_request_id(conn, header) - Logger.metadata(request_id: request_id) + Logger.metadata([{logger_metadata_key, request_id}]) conn = if assign_as, do: Conn.assign(conn, assign_as, request_id), else: conn Conn.put_resp_header(conn, header, request_id) diff --git a/test/plug/request_id_test.exs b/test/plug/request_id_test.exs index 6c6bbaa7..d535fdd8 100644 --- a/test/plug/request_id_test.exs +++ b/test/plug/request_id_test.exs @@ -82,6 +82,20 @@ defmodule Plug.RequestIdTest do assert res_request_id == meta_request_id end + test "adds the request id to Logger metadata with the given log key" do + request_id = "existingidthatislongenough" + + conn = + conn(:get, "/") + |> put_req_header("x-request-id", request_id) + |> call(logger_metadata_key: :plug_request_id) + + [res_request_id] = get_resp_header(conn, "x-request-id") + meta_request_id = Logger.metadata()[:plug_request_id] + assert generated_request_id?(res_request_id) + assert res_request_id == meta_request_id + end + defp generated_request_id?(request_id) do Regex.match?(~r/\A[A-Za-z0-9-_]+\z/, request_id) end