Packages
timber
2.1.2
3.1.2
3.1.1
3.1.0
3.0.0
3.0.0-alpha.3
3.0.0-alpha.2
3.0.0-alpha.1
2.8.4
2.8.3
2.8.2
2.8.1
2.8.0
2.7.0
2.6.1
2.6.0
2.5.6
2.5.5
2.5.4
2.5.3
2.5.2
2.5.1
2.5.0
2.4.5
2.4.4
2.4.3
2.4.2
2.4.1
2.4.0
2.3.4
2.3.3
2.3.1
2.3.0
2.2.1
2.2.0
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.2
2.0.1
2.0.0
2.0.0-rc7
2.0.0-rc6
2.0.0-rc5
2.0.0-rc4
2.0.0-rc3
2.0.0-rc2
2.0.0-rc1
1.1.18
1.1.17
1.1.16
1.1.15
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
🌲 Great Elixir Logging Made Easy. Official Timber.io Integration.
Current section
Files
Jump to
Current section
Files
lib/timber/events/http_server_request_event.ex
defmodule Timber.Events.HTTPServerRequestEvent do
@moduledoc """
The `HTTPServerRequestEvent` tracks *incoming* HTTP requests. This gives you structured
insight into the HTTP requests coming into your app.
Timber can automatically track incoming HTTP requests if you use a `Plug` based framework.
See `Timber.Integrations.ContextPlug` and `Timber.Integerations.EventPlug`. Also, the
`README.md` outlines how to set these up.
"""
alias Timber.Utils.HTTPEvents, as: UtilsHTTPEvents
@type t :: %__MODULE__{
body: String.t | nil,
host: String.t,
headers: map | nil,
method: String.t,
path: String.t,
port: pos_integer | nil,
query_string: String.t | nil,
request_id: String.t | nil,
scheme: String.t
}
@enforce_keys [:host, :method, :scheme]
defstruct [:body, :host, :headers, :method, :path, :port, :query_string, :request_id, :scheme]
@doc """
Builds a new struct taking care to:
* Parsing the `:url` and mapping it to the appropriate attributes.
* Normalize header values so they are consistent.
* Normalize the method.
* Removes "" or nil values.
"""
@spec new(Keyword.t) :: t
def new(opts) do
opts =
opts
|> Keyword.delete(:body) # Don't store the body for now. We store the params in the ControllerCallEvent. We can re-enable this upon request.
|> Keyword.update(:headers, nil, fn headers -> UtilsHTTPEvents.normalize_headers(headers) end)
|> Keyword.update(:method, nil, &UtilsHTTPEvents.normalize_method/1)
|> Keyword.merge(UtilsHTTPEvents.normalize_url(Keyword.get(opts, :url)))
|> Keyword.delete(:url)
|> Enum.filter(fn {_k,v} -> !(v in [nil, ""]) end)
struct!(__MODULE__, opts)
end
@doc """
Message to be used when logging.
"""
@spec message(t) :: IO.chardata
def message(%__MODULE__{method: method, path: path}),
do: [method, " ", path]
end