Packages
Professional observability suite for Gleam: structured logging, metrics, and statistical benchmarking
Current section
Files
Jump to
Current section
Files
src/viva_telemetry@log@handler.erl
-module(viva_telemetry@log@handler).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/viva_telemetry/log/handler.gleam").
-export([console/0, console_with_level/1, json/1, json_with_level/2, file/1, file_with_rotation/2, custom/2, get_level/1, should_log/2]).
-export_type([handler/0, console_config/0, json_config/0, file_config/0, custom_config/0, rotation/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" Handler interface for log outputs\n"
"\n"
" Handlers receive log entries and output them somewhere:\n"
" - Console (stdout/stderr)\n"
" - File (with rotation)\n"
" - JSON file (structured)\n"
" - Custom (network, database, etc.)\n"
).
-type handler() :: {console_handler, console_config()} |
{json_handler, json_config()} |
{file_handler, file_config()} |
{custom_handler, custom_config()}.
-type console_config() :: {console_config,
viva_telemetry@log@level:level(),
boolean(),
boolean()}.
-type json_config() :: {json_config,
viva_telemetry@log@level:level(),
binary(),
boolean()}.
-type file_config() :: {file_config,
viva_telemetry@log@level:level(),
binary(),
rotation()}.
-type custom_config() :: {custom_config,
viva_telemetry@log@level:level(),
fun((viva_telemetry@log@entry:entry()) -> nil)}.
-type rotation() :: no_rotation |
daily |
{size, integer()} |
{keep_n, integer(), rotation()}.
-file("src/viva_telemetry/log/handler.gleam", 83).
?DOC(" Default console handler (Info level, colored)\n").
-spec console() -> handler().
console() ->
{console_handler, {console_config, info, true, true}}.
-file("src/viva_telemetry/log/handler.gleam", 92).
?DOC(" Console handler with custom level\n").
-spec console_with_level(viva_telemetry@log@level:level()) -> handler().
console_with_level(Lvl) ->
{console_handler, {console_config, Lvl, true, true}}.
-file("src/viva_telemetry/log/handler.gleam", 101).
?DOC(" JSON handler\n").
-spec json(binary()) -> handler().
json(Path) ->
{json_handler, {json_config, info, Path, false}}.
-file("src/viva_telemetry/log/handler.gleam", 106).
?DOC(" JSON handler with level\n").
-spec json_with_level(binary(), viva_telemetry@log@level:level()) -> handler().
json_with_level(Path, Lvl) ->
{json_handler, {json_config, Lvl, Path, false}}.
-file("src/viva_telemetry/log/handler.gleam", 111).
?DOC(" File handler\n").
-spec file(binary()) -> handler().
file(Path) ->
{file_handler, {file_config, info, Path, no_rotation}}.
-file("src/viva_telemetry/log/handler.gleam", 116).
?DOC(" File handler with rotation\n").
-spec file_with_rotation(binary(), rotation()) -> handler().
file_with_rotation(Path, Rotation) ->
{file_handler, {file_config, info, Path, Rotation}}.
-file("src/viva_telemetry/log/handler.gleam", 121).
?DOC(" Custom handler\n").
-spec custom(
viva_telemetry@log@level:level(),
fun((viva_telemetry@log@entry:entry()) -> nil)
) -> handler().
custom(Lvl, Handler_fn) ->
{custom_handler, {custom_config, Lvl, Handler_fn}}.
-file("src/viva_telemetry/log/handler.gleam", 126).
?DOC(" Get handler's minimum level\n").
-spec get_level(handler()) -> viva_telemetry@log@level:level().
get_level(Handler) ->
case Handler of
{console_handler, C} ->
erlang:element(2, C);
{json_handler, C@1} ->
erlang:element(2, C@1);
{file_handler, C@2} ->
erlang:element(2, C@2);
{custom_handler, C@3} ->
erlang:element(2, C@3)
end.
-file("src/viva_telemetry/log/handler.gleam", 136).
?DOC(" Check if handler should process this level\n").
-spec should_log(handler(), viva_telemetry@log@level:level()) -> boolean().
should_log(Handler, Log_level) ->
viva_telemetry@log@level:is_enabled(Log_level, get_level(Handler)).