error_logger“死锁”问题

时间:2011-04-12 01:41:36

标签: erlang

我添加了一个事件处理程序,用于将error_logger报告重定向到syslog。处理程序如下所示:

handle_event({info_msg, _Gleader, {_Pid, Format, Data}}, #state{info_logger=Logger}=State) ->
    syslog_write("I", Logger, Format, Data),
    {ok, State};
handle_event({error, _Gleader, {_Pid, Format, Data}}, #state{error_logger=Logger}=State) ->
    syslog_write("E", Logger, Format, Data),
    {ok, State};
handle_event(_Event, State) ->
    {ok, State}.

syslog_write(Prefix, Facility, Format, Data) ->
    Cmd = try
              Message = lists:flatten(io_lib:format(Format, Data)),
              lists:flatten(io_lib:format("logger -t essmsd -p ~s.Debug \'<~s> ~s\'",
                                           [Facility, Prefix, Message]))
          catch 
              _:_ ->
                  lists:flatten(io_lib:format("logger -t essmsd -p ~s.Debug \'~p\'", 
                                              [Facility, [Prefix, Format, Data]]))
          end,
    os:cmd(Cmd).

我使用logger命令写入syslog文件。它首先工作,但运行一两天后,error_logger停止工作。它什么都不输出(当我在控制台上调用error_logger:info_msg(“test”)时,它只返回一个ok)无论输入是什么,既不是日志文件,也不是控制台。

有什么建议吗? thx提前。

更新:我在syslog_write和error_logger:info_msg中添加了跟踪,我得到了以下内容:

(essmsd@xx.xx.xx.xx)11> dbg:tracer(), dbg:p(all, c), dbg:tpl(error_logger, info_msg, x). {ok,[{matched,'essmsd@xx.xx.xx.xx',2},{saved,x}]} 

(essmsd@xx.xx.xx.xx)12> error_logger:info_msg("xx"). 
ok 
(<0.1735.0>) call error_logger:info_msg("xx") 

(essmsd@xx.xx.xx.xx)13> 
(<0.1735.0>) call error_logger:info_msg("xx",[]) 
(<0.1735.0>) returned from error_logger:info_msg/2 -> ok 
(<0.1735.0>) returned from error_logger:info_msg/1 -> ok 

这意味着正在调用error_logger:info_msg,但它从不输出任何内容,只是返回了一个ok!

2 个答案:

答案 0 :(得分:1)

问题是:

error_logger是否会停止处理消息,或者syslogd是否会导致问题?

如果您的系统已停止使用,则需要对其进行调试:

dbg:tracer(),dbg:p(all,c),dbg:tpl(Mod,Func,x)

对于连接到节点的shell上模块中的所有相关功能。

有关详细信息,请参阅How to refine the debugging?Using trace and dbg in Erlang

然后你可以看到实际发生了什么,以及你的syslog_write函数是否仍然被调用并且具有什么参数。

BTW有时可能是系统日志“问题”的原因:当您使用lesstail查看日志文件并保持其运行时。然后,一旦日志文件被旋转,您仍然可以打开旧文件,看起来只是停止了日志记录。实际上它会转到另一个文件。

答案 1 :(得分:0)

我发现了问题: 当我有一条空消息时,我会让logger命令永远运行!