OTP自带的日志机制很强大,但总是不习惯,我使用时发现日志记录量大时(比如上万的进程同时写日志,超过200MB后)很容易拖累系统。一个例子如图,这是一次崩溃后的dump文件,可以看到error_logger占用了大量的内存空间,而且还有160多万条消息等待处理中。这是在一次大量进程同时记录一个超时错误时发生的。日志文件也超过200MB。
如果使用多个文件间轮换的方式进行日志记录(rotating log),生成的并不是易读的文本日志,要在erlang中通过rb解读。
许多erlang应用都没有直接采用error_logger记录日志。
例如:
1. couchdb自己专门写了日志记录的模块couch_log,用一个supervisor模块管理couch_log,couch_log是一个gen_event的模块,显然日志的记录也是异步的,收到日志事件后负责往文件上写格式化后的日志信息。日志信息也是分级的。
2.当前版本的scalaris也有两个专门的日志记录模块,boot_logger和log,前者类似gen_server,接收日志信息并输出到终端或者文件,这个过程是同步的,后者其实就是一个文件写入的包装,不过写入之前会格式化日志信息加上时间标志。scalaris没有分级日志。
因此couchdb的日志要做得更像日志些。而提到专业的日志记录,这时不免怀念Java下的log4j,还好有log4erl了,用过log4j的会很熟悉,上手也容易。
0. 原理
log4erl是一个application,所以要使用必须先启动才行,log4erl做为application启动后会运行一个gen_server类型的模块接收记录日志请求,该模块最终调用一个gen_event的模块异步写日志。
1. 安装
直接在erlang安装目录的lib下解压文件,make后即可使用
2. 使用
记得要先启动作为application的log4erl:
application:start(log4erl)
与error_logger不同,log4erl不能直接将erlang term作为日志信息记录,log4erl的日志的使用类似与io:format。
其它与log4erl的使用相同,五级日志信息:warn | info | error | fatal | debug。
系统中有多个日志记录器(logger),用户根据自己的需要可以用不同的日志记录器记录不同类型的日志,这样我们可以按各种标准划分日志,例如不同功能模块的日志信息由不同的日志记录器负责。
这些日志记录器由用户自己定义的atom标识,还有一个缺省的日志记录器,如果你不指定哪个日志记录器记录,就会用缺省的那个。
每个日志记录器(logger)可以有一个或多个输出方式(这被称为appender),每个appender都有一个atom标识,各个appender可能各不相同,可以是输出到终端屏幕上的,可以是记录在文件上的,smtp的,未来还有记录到数据库上的、SNMP的、SMTP的。一个日志记录器有多个appender使得同一个日志信息可以记录在多个地方。
日志信息中还可包含格式化的时间信息。
例子:
1. 为缺省日志记录器添加一个终端输出的appender,日志记录格式加入时间格式和日志级别:
16> log4erl:add_console_appender(cmd_logs, {info, "%j %T [%L] %l%n"}).
17> log4erl:get_appenders().
[{console_appender,cmd_logs}]
18> log4erl:log(info, "received message ~p", [abc]).
18-03-2009 22:16:45,911948 [info] received message abc
19> log4erl:warn("~p", [{a,{b,[c,d,e]}}]).
18-03-2009 22:17:48,920603 [warn] {a,{b,[c,d,e]}}
具体看文档,帮助很详细。
update
新版本的scalaris开始使用log4erl记录日志,这是log4erl当前的一个比较大的应用了吧
- 大小: 152.7 KB
分享到:
相关推荐
用于Erlang的基于Syslog的日志记录框架和/或OTP logger程序处理程序。 该项目的灵感来自于和这两个项目中的出色工作。 实际上, syslog尝试将两种方法结合起来。 简而言之, syslog可以看作是lager日志记录框架的轻...
概述啤酒(如啤酒中的啤酒)是Erlang的日志记录框架。 其目的是提供一种在erlang应用程序中执行日志记录的更传统的方式,该方法可与logrotate和syslog之类的传统UNIX日志记录工具很好地配合使用。 :: [ ]特征更精细...
在开发和运行使用Erlang OTP或RabbitMQ的应用时,还需要了解Erlang的语法和编程模型,包括模块、函数、进程通信(通过消息传递)、错误处理和日志记录等。此外,熟悉RabbitMQ的基本概念,如exchange(交换器)、...
同时,理解RabbitMQ的插件机制也很重要,它允许扩展RabbitMQ的功能,例如日志记录、监控等。保持RabbitMQ和Erlang的更新,以获取最新的安全修复和性能优化,是维护一个健康消息队列系统的关键。
3. **插件体系**:RabbitMQ有丰富的插件系统,可以扩展其功能,例如管理界面、日志记录、监控等。 4. **广泛的语言支持**:RabbitMQ提供了多种编程语言的客户端库,如Java、Python、Ruby、.NET等,便于开发者使用。...
7. **错误处理和日志记录**:在开发TCP服务器时,错误处理和日志记录是必不可少的。Erlang提供了`error_logger`模块来记录应用程序的事件和异常,帮助调试和维护。 8. **连接池**:为了优化性能,可能会采用连接池...
- 提供了一些调试NIF的技巧,比如使用`erl_nif_trace`和日志记录。 通过学习Rustler编写Erlang NIF,开发者可以充分利用Rust的安全性和高性能,同时保持Erlang的并发优势和容错能力。这篇文章提供了一个实用的指南...
- 插件体系:RabbitMQ提供了丰富的插件,用于监控、日志记录、管理界面等功能。 - 多语言支持:RabbitMQ提供多种客户端库,支持Java、Python、Ruby、JavaScript等语言,方便不同语言的应用程序接入。 总的来说,otp...
Erlang 是一种功能强大的并发编程语言,以其在分布式系统、实时...同时,这也为自定义错误处理、日志记录和监控提供了基础。对于想要在 Erlang 环境下使用 MySQL 数据库的人来说,熟悉这些概念和实践是非常有价值的。
RabbitMQ的强大之处在于其灵活的插件系统,允许用户根据需求添加监控、日志记录、管理界面等功能。 总的来说,Erlang_win64_24.1.rar是为在Windows系统上搭建RabbitMQ环境提供必要的Erlang支持。了解Erlang的基本...
4. 插件系统:丰富的插件库提供了监控、管理、日志记录等功能,方便系统管理和维护。 5. 多语言客户端:RabbitMQ提供了多种编程语言的客户端库,包括Java,使得Java开发者可以轻松集成。 在安装Erlang和RabbitMQ的...
同时,日志记录和调试工具可以帮助识别和解决问题。 总结,"erlang-java聊天"项目展示了如何利用Erlang的并发和分布特性与Java的广泛应用相结合,构建一个初级的聊天系统。这不仅涉及到两种语言的编程技术,还涵盖...
`version.txt`则记录了项目的版本信息,这对于追踪代码的迭代和维护非常有用。 `proto`目录可能包含了游戏服务器使用的协议定义,这些协议定义了客户端与服务器之间的通信格式,例如玩家登录、移动、战斗等操作的...
- **错误处理**:包括故障检测、恢复机制和日志记录。 **3. Docs** 文档中可能涵盖了以下内容: - **Erlang语言指南**:解释Erlang的语法、数据类型、控制结构等基本概念。 - **OTP设计原则**:介绍OTP的行为模式、...
7. **日志与监控**:记录用户活动、错误日志和系统状态对于调试和优化非常重要。Erlang提供了`observer`工具和其他日志库来支持这些功能。 8. **性能优化**:随着用户数量增加,性能将成为关键。Erlang的并发模型和...
OTP(Open Telecom Platform)是Erlang的核心库,包含了各种实用工具和服务,如分布式计算、监控、日志记录和错误报告等,是构建大规模并发系统的基础。 总之,Erlang 21.0_win64是一个针对Windows 64位平台优化的...
5. **Web 服务器中间件**:Mochiweb 允许开发者使用中间件来扩展其功能,如日志记录、会话管理等。 在 "mochiweb-test" 文件夹中,可能包含以下内容: - **源代码文件**:通常会有 `.erl` 扩展名的 Erlang 源代码...
4. **日志和调试**:在开发过程中,使用日志记录转换过程,以便在出现问题时进行调试。 5. **性能评估**:对大量数据进行性能测试,以确定库在生产环境中的表现。 **文件名称列表解析** 在提供的压缩包中,只有一...
3. **插件系统**:RabbitMQ拥有丰富的插件系统,可以扩展其功能,如监控、日志记录、持久化等。 4. **消息确认机制**:发送者和接收者可以通过消息确认来确保消息的正确传输,防止消息丢失。 5. **队列和交换器**...