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的类型过滤功能。
  • 相关阅读:
    pandas-06 Series和Dataframe的排序操作
    java架构之路-(面试篇)JVM虚拟机面试大全
    java架构之路-(spring源码篇)springIOC容器源码解析(上)
    java架构之路-(SpringMVC篇)SpringMVC主要流程源码解析(下)注解配置,统一错误处理和拦截器
    java架构之路-(SpringMVC篇)SpringMVC主要流程源码解析(上)源码执行流程
    java架构之路-(分布式zookeeper)zookeeper集群配置和选举机制详解
    java架构之路-(分布式zookeeper)初识zookeeper安装与参数详解
    java架构之路-(mysql底层原理)Mysql事务隔离与MVCC
    java架构之路-(设计模式)五种创建型模式之单例模式
    java架构之路-(JVM优化与原理)JVM之G1回收器和常见参数配置
  • 原文地址:https://www.cnblogs.com/pandans/p/2443476.html
Copyright © 2011-2022 走看看