一:写在之前
二:实现接手的代码竟然不能直接输出异常,这个在调试上面不能忍啊。
项目用的log4erl,快上线了,也不能大刀阔斧的修改为lager,就研究了下如何让log4erl输出 error_logger
首先要明白error_logger 是怎么输出出来的
erlang 启动sasl会启动一个叫做error_logger的 gen_event ,这个event 会分发各种异常,我们要做的就是捕获异常输出到文件里
log4erl 本身提供了一个文件来捕获error_logger 的消息,默认不打开,
error_logger_log4erl_h:add_handler/0
调用这个函数先注册handler,可以调用 gen_event:which_handler(error_logger)来查看是否添加上去
本来以为这样就成功了,但是碰到异常的时候log4erl一直崩溃,查看到原因
log_formatter:format/2 这个函数里面调用了 get_token_value
当 获取token为 log时,出了问题
上面是我修改过的,error_log 在get_token_value的时候 获取到的Msg 是一个 atom 自然不能调用 io_lib:formatget_token_value(log, Log) -> Msg = Log#log.msg, Data = Log#log.data, case is_atom(Msg) of true -> io:format("crash report =========== ~n log ~p~n", [Log]), io_lib:format("~n" ++ atom_to_list(Msg) ++ "=====================================~n\~p", [Data]); false -> io_lib:format(Msg, Data) end;
检测一下,按照自己希望的格式返回即可
这样日志文件内就有 error_log 的内容了,勉强能用,不过有时间的各位希望还是换lager要方便很多