log4erl输出error_logger

来源:互联网 发布:深圳java薪水 编辑:程序博客网 时间:2024/05/17 04:50

一:写在之前

接手的代码竟然不能直接输出异常,抓狂这个在调试上面不能忍啊。

项目用的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时,出了问题

get_token_value(log, Log) ->    Msg = Log#log.msg,    Data = Log#log.data,case is_atom(Msg) oftrue ->            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 在get_token_value的时候 获取到的Msg 是一个 atom 自然不能调用 io_lib:format 

检测一下,按照自己希望的格式返回即可
这样日志文件内就有 error_log 的内容了,勉强能用,不过有时间的各位希望还是换lager要方便很多


0 0