这个事, 说大不大说小又不小. 大点的, 可以用scribe flume 这样的系统去做, 小点的, 也就打印一个调试信息而已. 在Erlang 中, log 这事情确实比较伤, error_logger 是个单点, io:format 容易导致节点崩溃. 在开源社区, lager 算是使用比较广泛的一个, 然而, 同样不能完全避免单点的问题. 因为在lager 中, lager_event 作为 core, 是单个进程存在的.
1 dispatch_log(Severity, Metadata, Format, Args, Size) when is_atom(Severity)-> 2 SeverityAsInt=lager_util:level_to_num(Severity), 3 case {whereis(lager_event), lager_config:get(loglevel, {?LOG_NONE, []})} of 4 {undefined, _} -> 5 {error, lager_not_running}; 6 {Pid, {Level, Traces}} when (Level band SeverityAsInt) /= 0 orelse Traces /= [] -> 7 do_log(Severity, Metadata, Format, Args, Size, SeverityAsInt, Level, Traces, Pid); 8 _ -> 9 ok 10 end.
也就是在lager 中, 所有的log 都需要经过 lager_event 进程.