用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的类型过滤功能。
分享到:
相关推荐
Erlang提供了自动检测节点连接状态的功能,当节点连接中断时,可以自动释放资源并通知受影响的进程。 **6.5 银行示例** 银行示例是一个经典的分布式应用场景。通过构建一个分布式的银行系统,可以模拟客户与银行...
Erlang提供了多种工具和技术来监测数据流,包括但不限于`observer`工具、日志记录和异常处理机制等。通过对数据流的实时监控,开发人员可以及时发现并解决问题。 **4. 代码复用** 代码复用对于提高开发效率至关...
5. **Web 服务器中间件**:Mochiweb 允许开发者使用中间件来扩展其功能,如日志记录、会话管理等。 在 "mochiweb-test" 文件夹中,可能包含以下内容: - **源代码文件**:通常会有 `.erl` 扩展名的 Erlang 源代码...
- **解析**: 使用Erlang内置库或第三方库进行CSV文件的读取和解析。 - **应用场景**: 数据导入导出。 #### 39. Erlang文件操作 - **文件读取**: 使用`file:read_file/1`函数读取文件内容。 - **注意事项**: 需要...
同时,日志记录和调试工具可以帮助识别和解决问题。 总结,"erlang-java聊天"项目展示了如何利用Erlang的并发和分布特性与Java的广泛应用相结合,构建一个初级的聊天系统。这不仅涉及到两种语言的编程技术,还涵盖...
- **公共API工具**:如XML和JSON解析器,日期和时间处理,以及其他通用功能。 **5. PR.template** `PR.template`可能是Pull Request模板,用于贡献者向开源项目提交更改的指导。 **6. COPYRIGHT** `COPYRIGHT`文件...
- **错误处理与日志记录**:学习Erlang的异常处理机制,以及如何有效地记录和调试问题。 - **模式匹配与函数选择**:掌握如何利用模式匹配来编写高效且简洁的代码。 - **分布式Erlang**:学习如何在多台机器上部署和...
Erlang Lib of Iconv是将Iconv功能集成到Erlang语言的一个库,使得Erlang程序员能够方便地处理各种字符编码问题。 这篇博文《Erlang Lib of Iconv》(链接:https://maxtqm.iteye.com/blog/118429)可能详细介绍了...
5. **日志过滤和解析**:服务器可能包含对日志数据的过滤和解析功能,便于用户根据关键词、级别或其他条件筛选和分析日志。 6. **日志存储与检索**:Erlang Syslog Server 可能集成了日志存储功能,如写入数据库...
3. **inet模块**:Erlang的inet模块提供了与网络相关的功能,包括TCP套接字的创建、监听和连接操作。例如,`inet:listen/2`用于开启一个监听套接字,`inet:accept/1`用于接受新的连接。 4. **gen_tcp模块**:这个...
《OpenTelemetry-Erlang-API:Erlang与Elixir的可观测性框架解析》 在分布式系统开发中,监控和日志分析是至关重要的环节,它们帮助开发者了解系统的运行状态,快速定位并解决问题。OpenTelemetry是一个跨平台的可...
:: [ ]特征更精细的日志级别(调试,信息,通知,警告,错误,严重,警报,紧急情况) 使用解析转换来转换记录器调用,以允许捕获模块/功能/行/ Pid信息当没有处理程序正在使用日志级别(例如,调试)时,不会将...
- **日志分析**:XML格式的日志文件可以使用`fast_xml`快速解析,提取关键信息。 - **配置文件处理**:某些应用程序可能使用XML作为配置文件格式,`fast_xml`可以轻松读取和解析这些文件。 总之,`fast_xml`是...
本文将深入探讨“echatServer”这个Erlang聊天室服务器的源码,解析其核心概念和技术。 1. **进程模型** Erlang中的进程是轻量级的,它们之间通过消息传递进行通信。在echatServer中,每个用户连接可能对应一个...
6. **日志与监控**:Erlang Cron还可能包含日志记录和监控功能,帮助开发者跟踪任务执行情况,检测潜在问题,以及优化任务执行效率。 在`erlcron-master`这个项目中,我们可以找到Erlang克罗尼什系统的源代码实现。...
泽塔 Zeta 是一个 HTTP 访问日志解析器,它提供了用于解析数据的格式化语法。要求Erlang/OTP 14 或更新版本。建造克隆存储库并运行make或将以下内容添加到您的钢筋配置文件中。 {deps, [ ... {zeta, ".*", {git, ...
总之,Erlang IPFS客户端API为Erlang开发者提供了与IPFS网络交互的强大工具,使他们能够在Erlang应用中轻松地集成分布式存储和共享功能。通过熟练掌握这个API,开发者可以构建出充分利用IPFS特性的创新应用程序。