Erlang 错误“U记录器”;“僵局”;问题

Erlang 错误“U记录器”;“僵局”;问题,erlang,Erlang,我添加了一个事件处理程序,将错误日志记录器报告重定向到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, D

我添加了一个事件处理程序,将错误日志记录器报告重定向到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).
handle_事件({info_msg,{u Gleader,{u Pid,Format,Data}},{state}{info_logger=logger}=state)->
syslog_write(“I”、记录器、格式、数据),
{好的,国家};
handle_事件({error,{u Gleader,{u Pid,Format,Data}},{state}{error_logger=logger}=state)->
syslog_write(“E”、记录器、格式、数据),
{好的,国家};
处理事件(\u事件,状态)->
{好的,州政府}。
syslog_write(前缀、功能、格式、数据)->
Cmd=try
消息=列表:展平(io_lib:format(format,Data)),
列表:展平(io_lib:format(“logger-t esmsd-p~s.Debug\'~s\'”,
[设施、前缀、消息])
抓住
_:_ ->
列表:展平(io_lib:format(“logger-t esmsd-p~s.Debug\'~p\'”,
[设施[前缀、格式、数据]])
完,,
操作系统:cmd(cmd)。
我使用logger命令写入syslog文件。它一开始工作,但在运行一到两天后,错误记录器停止工作。无论输入是什么,它都不会输出任何内容(当我在控制台上调用error\u logger:info\u msg(“test”)时,它只返回ok),既不会输出到日志文件,也不会输出到控制台

有什么建议吗?thx提前

更新:我在syslog\u write和error\u logger:info\u 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 
(essmsd@xx.xx.xx.xx)11> dbg:tracer(),dbg:p(all,c),dbg:tpl(error\u logger,info\u msg,x)。{好的,[{匹配,'essmsd@xx.xx.xx.xx“,2},{已保存,x}]}
(essmsd@xx.xx.xx.xx)12> 错误\记录器:信息\消息(“xx”)。
好啊
()呼叫错误记录程序:信息消息(“xx”)
(essmsd@xx.xx.xx.xx)13> 
()调用错误\u记录器:信息\u消息(“xx”,[])
()从错误日志程序返回:info\u msg/2->ok
()从错误日志程序返回:info\u msg/1->ok
这意味着调用了error\u logger:info\u msg,但它只返回ok

问题是:

错误记录器是否停止处理消息,或者您的系统日志是否导致问题

如果系统已停止工作,则需要对其进行调试。请使用:

dbg:tracer(),dbg:p(all,c),dbg:tpl(Mod,Func,x)
用于连接到节点的外壳上的模块中的所有相关函数

有关详细信息,请参阅和

然后,您可以看到实际发生了什么,您的syslog_write函数是否仍然被调用,以及使用了哪些参数

顺便说一句,系统日志“问题”的原因有时是什么:当您使用
less
tail查看日志文件并保持其运行时。然后,一旦日志文件被旋转,您仍然会打开旧文件,并且日志记录似乎刚刚停止。实际上,它将转到另一个文件。

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

系统日志工作正常,但错误日志记录器停止工作。我可以首先使用error\u logger输出到控制台,但在问题发生后,调用error\u logger:info\u msg时,我看不到输出。感谢您的回复,我将检查发生了什么。to_syslog_handler:syslog_write未被调用。事实上,如果我跟踪错误日志记录器,它将返回以下结果:(essmsd@xx.xx.xx.xx)11> dbg:tracer(),dbg:p(all,c),dbg:tpl(error\u logger,info\u msg,x)。{好的,[{匹配,'essmsd@xx.xx.xx.xx“,2},{已保存,x}]}(essmsd@xx.xx.xx.xx)12> 错误\记录器:信息\消息(“xx”)。ok()调用错误记录程序:信息消息(“xx”)(essmsd@xx.xx.xx.xx)13> ()调用错误记录程序:info_msg(“xx”,[])()从错误记录程序返回:info_msg/2->ok()从错误记录程序返回:info_msg/1->okerror\u从跟踪程序判断调用了记录程序,但没有任何输出!你能编辑你的问题并添加痕迹吗。他们在评论中有点难读。