Current section

Files

Jump to
diint_utilites_common_app src log json_logger_formatter.erl
Raw

src/log/json_logger_formatter.erl

-module(json_logger_formatter).
-export([format/2,output_message/7]).
format( #{level := Level,
msg := Message,
meta := #{pid := Pid,
time := Timestamp,
line := Line} = Meta} = MI, _FConfig)->
{MODULE, FUNCTION_NAME, _FUNCTION_ARITY} = get_mfa_data(Meta),
output_message(Level,Message,msToDate(Timestamp), MODULE,FUNCTION_NAME,MI,Pid);
format( #{level := Level,
msg := Message,
meta := #{pid := Pid}} = MI, _FConfig) ->
output_message(Level,Message,calendar:now_to_local_time(os:timestamp()), unknown,unknown, MI,Pid);
format( #{level := Level,
msg := Message} = MI, _FConfig) ->
output_message(Level,Message,calendar:now_to_local_time(os:timestamp()), unknown,unknown, MI,erlang:list_to_pid("<0.1.0>")).
get_message({report, Report})->
Report;
get_message({string, Chardata})->
#{text => unicode:characters_to_binary(Chardata)};
get_message({Io, Data})-> #{ text => unicode:characters_to_binary(io_lib:format(Io,Data)), param => Data}.
get_default_config()->
#{chars_limit => unlimited,
depth => unlimited,
legacy_header => true,
max_size => unlimited,
report_cb => fun(Report) -> logger:format_report(Report) end,
single_line => true,
template => [time," ",level,": ",msg,"\n"],
time_designator => $T,
time_offset => ""}.
msToDate(Milliseconds) ->
MegaSecs = Milliseconds div 1000000000000,
Secs = Milliseconds div 1000000 - MegaSecs*1000000,
MicroSecs = Milliseconds rem 1000000,
calendar:now_to_local_time({MegaSecs, Secs, MicroSecs}).
% BaseDate = calendar:datetime_to_gregorian_seconds({{1970,1,1},{0,0,0}}),
% Seconds = BaseDate + (Milliseconds div 1000000),
% {Date, {Hour, Minute, Second}} = calendar:gregorian_seconds_to_datetime(Seconds),
% {Date,{Hour + 3 rem 23,Minute, Second}}.
get_mfa_data(Meta) ->
case Meta of
#{mfa := MFA} ->
case MFA of
{MODULE, _FUNCTION_NAME, _FUNCTION_ARITY} -> {MODULE, _FUNCTION_NAME, _FUNCTION_ARITY};
_else -> {unknown, unknown, unknown}
end;
_else -> {unknown, unknown, unknown}
end.
output_message(Level,Message,Time, MODULE,FUNCTION_NAME,MI,Pid) ->
case jsone:try_encode(#{level => Level, message => get_message(Message), time => Time,module => MODULE,func_name => FUNCTION_NAME, pid => erlang:pid_to_list(Pid)},[native_utf8]) of
{ok,Bin} -> Bin;
_ -> case jsone:try_encode(#{message => #{text =>unicode:characters_to_binary(logger_formatter:format(MI,get_default_config()))}, level => Level, time => Time, module => MODULE,func_name => FUNCTION_NAME, pid => erlang:pid_to_list(Pid)},[native_utf8]) of
{ok,Bin} -> Bin;
_ -> {ok,Bin} = jsone:try_encode(#{message => #{ text => <<"критическая ошибка логирования">>}, level => <<"Fatal">>, pid => erlang:pid_to_list(Pid)}), Bin
end
end.