Packages
sentry
13.0.0
13.3.0
13.2.0
13.1.0
13.0.1
13.0.0
12.0.3
12.0.2
12.0.1
12.0.0
11.0.4
11.0.3
11.0.2
11.0.1
11.0.0
10.10.0
10.9.0
10.8.1
10.8.0
10.7.1
10.7.0
10.6.2
10.6.1
10.6.0
10.5.0
10.4.0
10.3.0
10.2.1
10.2.0
10.2.0-rc.2
10.2.0-rc.1
10.1.0
10.0.3
10.0.2
10.0.1
10.0.0
9.1.0
9.0.0
8.1.0
8.0.6
8.0.5
8.0.4
8.0.3
8.0.2
8.0.1
8.0.0
8.0.0-rc.2
8.0.0-rc.1
8.0.0-rc.0
retired
7.2.5
7.2.4
7.2.3
7.2.2
7.2.1
7.2.0
7.1.0
7.0.6
7.0.5
7.0.4
7.0.3
7.0.2
7.0.1
7.0.0
6.4.2
6.4.1
6.4.0
6.3.0
6.2.1
6.2.0
6.1.0
6.0.5
6.0.4
6.0.3
6.0.2
6.0.1
6.0.0
5.0.1
5.0.0
4.0.3
4.0.2
4.0.1
4.0.0
3.0.0
2.2.0
2.1.0
2.0.2
2.0.1
2.0.0
1.1.2
1.1.1
1.1.0
1.0.0
0.3.2
0.3.1
0.3.0
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0
The Official Elixir client for Sentry
Current section
Files
Jump to
Current section
Files
lib/sentry/logger_handler/logs_backend.ex
defmodule Sentry.LoggerHandler.LogsBackend do
@moduledoc false
# Backend that sends log events to Sentry's Logs Protocol.
#
# This backend is enabled at handler setup time when `enable_logs: true` is set
# in Sentry configuration. Logs configuration (level, excluded_domains, metadata)
# is read from `Sentry.Config` at runtime.
@behaviour Sentry.LoggerHandler.Backend
require Logger
alias Sentry.{Config, LogEvent, LoggerUtils, TelemetryProcessor}
@impl true
def handle_event(%{level: log_level, meta: log_meta} = log_event, _config, _handler_id) do
cond do
Logger.compare_levels(log_level, Config.logs_level()) == :lt ->
:ok
LoggerUtils.excluded_domain?(Map.get(log_meta, :domain, []), Config.logs_excluded_domains()) ->
:ok
true ->
send_log_event(log_event)
end
end
defp send_log_event(%{meta: log_meta} = log_event) do
attributes = extract_metadata(log_meta, Config.logs_metadata())
# Extract parameters for message template interpolation (if provided via metadata)
parameters = Map.get(log_meta, :parameters)
# Create log event
log_event_struct = LogEvent.from_logger_event(log_event, attributes, parameters)
case TelemetryProcessor.add(log_event_struct) do
{:ok, {:rate_limited, data_category}} ->
Sentry.ClientReport.Sender.record_discarded_events(:ratelimit_backoff, data_category)
:ok ->
:ok
end
:ok
end
defp extract_metadata(_log_meta, []), do: %{}
defp extract_metadata(log_meta, :all) do
log_meta
|> Map.drop([:time, :gl, :report_cb, :domain, :mfa, :file, :line, :pid])
|> Enum.into(%{})
end
defp extract_metadata(log_meta, metadata_keys) when is_list(metadata_keys) do
Enum.reduce(metadata_keys, %{}, fn key, acc ->
case Map.fetch(log_meta, key) do
{:ok, value} -> Map.put(acc, key, value)
:error -> acc
end
end)
end
end