Packages
timber
1.1.5
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.ex
defmodule Timber do
@moduledoc """
The functions in this module work by modifying the Logger metadata store which
is unique to every BEAM process. This is convenient in many ways. First and
foremost, it does not require you to manually manage the metadata. Second,
because we conform to the standard Logger principles, you can utilize Timber
alongside other Logger backends without issue. Timber prefixes its contextual
metadata keys so as not to interfere with other systems.
## The Context Stack
"""
use Application
alias Timber.{Context, Contextable}
@doc """
Adds a context entry to the stack. See `Timber::Contexts::CustomContext` for examples.
"""
@spec add_context(Context.context_element) :: :ok
def add_context(data) do
current_metadata = Elixir.Logger.metadata()
current_context = Keyword.get(current_metadata, :timber_context, Context.new())
context_element = Contextable.to_context(data)
new_context = Context.add(current_context, context_element)
Elixir.Logger.metadata([timber_context: new_context])
end
@doc """
Used to time runtime execution. For example, when timing a `Timber.Events.HTTPClientRequestEvent`:
```elixir
timer = Timber.start_timer()
# .... make request
time_ms = Timber.duration_ms(timer)
event = HTTPClientResponseEvent.new(status: 200, time_ms: time_ms)
message = HTTPClientResponseEvent.message(event)
Logger.info(message, event: event)
```
"""
defdelegate start_timer, to: Timber.Timer, as: :start
@doc """
Captures the duration in fractional milliseconds since the timer was started. See
`start_timer/0`.
"""
defdelegate duration_ms(timer), to: Timber.Timer
@doc false
# Handles the application callback start/2
#
# Starts an empty supervisor in order to comply with callback expectations
#
# This is the function that starts up the error logger listener
#
def start(_type, _opts) do
import Supervisor.Spec, warn: false
children = []
opts = [strategy: :one_for_one, name: Timber.Supervisor]
Supervisor.start_link(children, opts)
end
end