zoukankan      html  css  js  c++  java
  • 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的类型过滤功能。
  • 相关阅读:
    RecyclerView 数据刷新的几种方式 局部刷新 notify MD
    【图片】批量获取几万张图片
    RV BaseRecyclerViewAdapterHelper 总结 MD
    RecyclerView.ItemDecoration 间隔线
    Kotlin【简介】Android开发 配置 扩展
    Kotlin 特性 语法糖 优势 扩展 高阶 MD
    一个十分简洁实用的MD风格的UI主框架
    折叠伸缩工具栏 CollapsingToolbarLayout
    FloatingActionButton FAB 悬浮按钮
    Glide Picasso Fresco UIL 图片框架 缓存 MD
  • 原文地址:https://www.cnblogs.com/pandans/p/2443476.html
Copyright © 2011-2022 走看看