我添加了一个事件处理程序,用于将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!
答案 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有时可能是系统日志“问题”的原因:当您使用less
或tail
查看日志文件并保持其运行时。然后,一旦日志文件被旋转,您仍然可以打开旧文件,看起来只是停止了日志记录。实际上它会转到另一个文件。
答案 1 :(得分:0)
我发现了问题: 当我有一条空消息时,我会让logger命令永远运行!