Erlang logcat

erlang日志功能----问题解析

    用mochiweb搭建好代码框架后,发现并没有日志功能,于是决定增加日志。
    我用过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的类型过滤功能。
posted @ 2012-04-12 10:25  pandans  阅读(674)  评论(0编辑  收藏  举报