用log4erl怎么获取 error_logger捕获到的OTP系统的错误信息?

log4erl是一个在Erlang下很好的处理log的tools。可是,一些系统崩溃的error_msg不能用log4erl直接捕捉。因为OTP系统默认的error处理是给error_logger的。

可是系统崩溃的log对于debug和improve来说至关重要。一开始,我是一面用log4erl,一面用error_logger:logfile({open, FileName})来分别记录我自己定义的log和捕捉系统崩溃时的log。

之前,就有听说过error_logger可以自己写callback module然后add_report_handler。可是,之前一直没有时间去看,这个callback module的具体要求和格式。

今天发现了log4erl下面原来已经提供了这个callback module:error_logger_log4erl_h,所以,这一切都变得很简单。只要:

error_logger:add_report_handler(error_logger_log4erl_h).

就可以,转给log4erl来记录相应的系统发出的log了。

看了一下,error_logger_log4erl_h的源代码,发现原来就是这么简单地mapping一下就可以了:


-module(error_logger_log4erl_h).
-behaviour(gen_event).
...
-record(elogger_l4e_mappings, {error=error, info_msg=info, warning_msg=warn,
error_report=error, info_report=info,
warning_report=warn}).
...
init([])->
{ok, #elogger_l4e_mappings{}};
init(Conf) ->
io:format("Conf ~p~n",[Conf]),
{ok, mapping(Conf, #elogger_l4e_mappings{})}.
...

handle_event({error, _GLeader, {_PID, Msg, Data}}, #elogger_l4e_mappings{error=L} = State) ->
R = log4erl:log(L, Msg, Data),
{R, State};
handle_event({info_msg, _GLeader, {_PID, Msg, Data}}, #elogger_l4e_mappings{info_msg=L} = State) ->
R = log4erl:log(L, Msg, Data),
{R, State};
handle_event({warning_msg, _GLeader, {_PID, Msg, Data}}, #elogger_l4e_mappings{warning_msg=L} = State) ->
R = log4erl:log(L, Msg, Data),
{R, State};
handle_event({error_report, _GLeader, _}, State) ->
{ok, State};
handle_event({info_report, _GLeader, _}, State) ->
{ok, State};
handle_event({warning_report, _GLeader, _}, State) ->
{ok, State}.
...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值