Packages

Typed distributed messaging for Gleam on the BEAM.

Retired package: Deprecated - The project needs to be redesigned around a much smaller and clearer core.

Current section

Files

Jump to
distribute src logger_ffi.erl
Raw

src/logger_ffi.erl

%% Simple logger backend FFI for Gleam 'log' module
%% Simple logger backend FFI for Gleam 'log' module
% Module declaration
-module(logger_ffi).
-export([log/3, set_backend/1]).
%% Set backend name in persistent_term (string): "console" or "erlang_logger"
set_backend(BackendBin) when is_binary(BackendBin) ->
persistent_term:put("distribute_log_backend", BackendBin),
ok.
%% Log the message. Map level string to erlang logger level if set to "erlang_logger"
log(LevelBin, MsgBin, MetaBin) when is_binary(LevelBin), is_binary(MsgBin), is_binary(MetaBin) ->
Backend = persistent_term:get("distribute_log_backend", <<"console">>),
case Backend of
<<"console">> -> io:put_chars(MsgBin);
<<"erlang_logger">> ->
LevelAtom = case LevelBin of
<<"DEBUG">> -> debug;
<<"INFO">> -> info;
<<"WARN">> -> warning;
<<"ERROR">> -> error;
_ -> info
end,
MetaMap = parse_meta(MetaBin),
logger:log(LevelAtom, #{message => MsgBin, meta => MetaMap});
_ -> io:put_chars(MsgBin)
end.
parse_meta(<<>>) -> #{};
parse_meta(MetaBin) when is_binary(MetaBin) ->
RawList = string:tokens(binary_to_list(MetaBin), ","),
parse_tokens(RawList, #{}).
parse_tokens([], Map) -> Map;
parse_tokens([Token | Rest], Map) ->
case string:tokens(Token, "=") of
[K, V] -> NewMap = maps:put(list_to_binary(string:trim(K)), list_to_binary(string:trim(V)), Map),
parse_tokens(Rest, NewMap);
_ -> parse_tokens(Rest, Map)
end.