-module(json_logger_formatter). -export([format/2]). format( #{level := Level, msg := Message, meta := #{pid := Pid, time := Timestamp, line := Line, mfa := {MODULE, FUNCTION_NAME, _FUNCTION_ARITY} }} = MI, _FConfig)-> case jsone:try_encode(#{level => Level, message => get_message(Message), time => msToDate(Timestamp),module => MODULE,func_name => FUNCTION_NAME},[native_utf8]) of {ok,Bin} -> Bin; _else -> case jsone:try_encode(#{message => unicode:characters_to_binary(logger_formatter:format(MI,get_default_config())), level => Level, time => msToDate(Timestamp), module => MODULE,func_name => FUNCTION_NAME},[native_utf8]) of {ok,Bin} -> Bin; _else -> jsone:try_encode(#{message => <<"критическая ошибка логирования">>, level => <<"Fatal">>}) end end. get_message({report, Report})-> Report; get_message({string, Chardata})-> unicode:characters_to_binary(Chardata); get_message({Io, Data})-> io_lib:format(Io,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}}.