浏览 3197 次
锁定老帖子 主题:erlang日志功能----问题解析
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-16
我用过log4c以及ACE的日志功能。其中,最喜欢的就是,日志信息的分级过滤功能。可以根据不同情况,控制日志中输出的信息,而不用在代码中注释掉部分信息。还有日志大小控制功能,可以避免日志文件占用过多的系统资源。 《Programming Erlang》说,在erlang OTP中已经内置了一个日志模块,并具备过滤功能。直接使用其提供的配置文件elog4.config。并定义了4个宏,分别对应error_logger中的error_XXX,info_XXX函数。如下: [{sasl, [ %% minimise shell error logging {sasl_error_logger, false}, %% only report errors {errlog_type, error}, %% define the parameters of the rotating log %% the log file directory {error_logger_mf_dir,"./logs"}, %% # bytes per logfile {error_logger_mf_maxbytes,10485760}, % 10 MB %% maximum number of {error_logger_mf_maxfiles, 10} ]}]. -define (IMSG(X), error_logger:info_msg("~p:~p ~p~n",[?MODULE, ?LINE, X])). -define (IREPORT(X), error_logger:info_report([{module, ?MODULE}, {line, ?LINE}|X])). -define (EMSG(X), error_logger:error_msg("~p:~p ~p~n",[?MODULE, ?LINE, X])). -define (EREPORT(X), error_logger:error_report([{module, ?MODULE}, {line, ?LINE}|X])). 写了一个测试。运行后,在用rb查看日志信息时,发现了问题。 按《Programming Erlang》中的描述,使用这个配置,应该只记录error信息才对。结果是,日志中不仅有error信息,还有info信息以及progress信息。 大惑。google之,找到一篇文章(http://erlang.org/pipermail/erlang-questions/2008-October/039028.html)。其大意是errlog_type是受sasl_error_logger影响的。如果设置了{sasl_error_logger, false},那么{errlog_type, error}将失效。 英文不佳,没有理解透彻,只好看代码了。原来,sasl中有两个日志事件处理器,分别是sasl_error_logger、error_logger_mf。 配置文件中的参数,可以分为两种。其中,参数sasl_error_logger、errlog_type是为sasl_error_logger日志处理器服务的。而参数error_logger_mf_dir、error_logger_mf_maxbytes、error_logger_mf_maxfiles是为error_logger_mf服务的。两组参数互不影响。 sasl_error_logger是一个保存文本数据的日志处理器。只记录监管(supervisor_report)、崩溃(crash_report)、进程(progress)三种报告。可以根据参数{errlog_type, XXXX}的不同,对报告进行过滤。XXXX是progress时,只记录进程报告。XXXX是error时,记录监管、崩溃两种报告。 对开发调试、维护跟踪真正有用的是error_logger_mf日志处理器。它是一个保存二进制数据的日志处理器,需要使用rb才能浏览其中的信息。会记录所有类型的日志信息,却不能过滤任何信息。 郁闷,最想要的功能,偏偏没有。看来只能使用-ifdef()来控制输出的信息,或者使用log4erl了。 ps:在http://erlang.org/pipermail/erlang-questions/2008-October/039028.html中,对erlang的日志功能存在的一些问题。还介绍了一个error_logger_mf的替代方案。其输出的是文本格式的日志文件,但依然不具备过滤功能。 在阅读log_mf_h.erl时发现,log_mf_h是可以指定一个过滤函数的。只有当这个函数返回true时,才会向日志文件中写入信息。而在sasl.erl中设定的过滤函数,基本没有进行任何过滤。 看来,有时间的话,可以试试修改sasl.erl中的过滤函数,实现log_mf_h的类型过滤功能。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-09-17
这个分级可以参考ejabberd的方法。
|
|
返回顶楼 | |