-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.