Packages
timber
0.3.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/log_entry.ex
defmodule Timber.LogEntry do
@moduledoc """
The LogEntry module formalizes the structure of every log entry
When a log is produced, it is converted to this intermediary form
by the `Timber.Logger` module before being passed on to the desired
transport. Each transport implements a `write/2` function as defined
by the `Timber.Transport.write/2` behaviour. Inside of this function,
the transport is responsible for formatting the data contained in a
log entry appropriately.
Each log entry consists of the log message, its level, the timestamp
it was logged at, a context map, and an optional event.
See the main `Timber` module for more information.
"""
alias Timber.Context
alias Timber.Logger
alias Timber.Event
alias Timber.Utils
@type t :: %__MODULE__{
dt: IO.chardata,
level: Logger.level,
message: Logger.message,
context: Context.t,
event: Event.t | nil
}
defstruct context: %{}, dt: nil, level: nil, message: nil, event: nil
@doc """
Creates a new `LogEntry` struct
The metadata from Logger is given as the final parameter. If the
`:timber_context` key is present in the metadata, it will be used
to fill the context for the log entry. Otherwise, a blank context
will be used.
"""
@spec new(Logger.timestamp, Logger.level, Logger.message, Keyword.t) :: t
def new(timestamp, level, message, metadata) do
io_timestamp =
Timber.Utils.format_timestamp(timestamp)
|> IO.chardata_to_string()
context = Keyword.get(metadata, :timber_context, %{})
event = Keyword.get(metadata, :timber_event, nil)
%__MODULE__{
dt: io_timestamp,
level: level,
event: event,
message: message,
context: context
}
end
@doc """
Encodes the log event to a JSON document
## Options
- `:only` - A list of key names. Only the key names passed will be encoded.
"""
@spec to_json_string!(t, Keyword.t) :: iodata | no_return
def to_json_string!(log_entry, options) do
# Reformats the event so that the event
# can be properly interpreted by the log ingester
event = Event.event_for_encoding(log_entry.event)
log_entry = %__MODULE__{log_entry | event: event}
only = Keyword.get(options, :only, false)
value_to_encode =
if only do
Map.take(log_entry, only)
else
Map.from_struct(log_entry)
end
|> Utils.drop_nil_values()
Poison.encode_to_iodata!(value_to_encode)
end
end