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日志记录工具很好地配合使用。 :: [ ]特征更精细...
sysloggerl:Erlang 的系统日志记录器 sysloggerl是一个纯应用程序,用于使用 UDP 套接字将消息记录到 syslog 守护进程。 它提供了一个可定制的事件处理程序,并且可以处理多个具有不同日志记录选项的记录器。 目前...
1.完成makefile,直接运行/script目录中的makefile.cmd就能编译文件 2.完成启动多节点的脚本,运行/script目录中的run.cmd可以启动3个节点, 节点的配置在/config目录config.txt中 ...4.完成日志记录系统
Erlang编码标准和准则 建议的阅读材料: : 目录: 荣耀干 按功能对子目录中的模块进行分组 头文件 句法 不要写意粉代码 避免动态通话 避免深层嵌套 避免如果表达式 ...正确使用日志记录级别 指定依
更具体地说,这个项目的目标是允许 Erlang/OTP 开发人员通过将横切关注点(例如日志记录)放入单独的文件(即模块)又名方面来保持他们的应用程序干净和易于理解。 在撰写本文时, weaverl 仅支持 。 到目前为止,...
一个日志应用,用于记录系统运行时的日志信息 数据库系统: 数据库选用mysql,应该会用到第三方库去连接,用一些进程池去处理IO操作 逻辑模块: 包含场景管理、怪物管理、人物管理、战斗逻辑等相关的游戏逻辑 项目编译...
它为新的微基准测试提供了测试运行程序,计时和日志记录,因此它们可以高效地编写并以可重复的方式运行。 最后,它是一组微型基准测试,可以针对新的硬件和VM目标重新运行。 最有趣的事情是使用出色的库来完成的。...
用于在Erlang中重播日志的磁盘队列 特征 队列项目被写入磁盘上的段文件中,以便在重启后不受影响。 批量弹出项目超出了大小/计数限制的队列。 提供ack/2 API来记录读取器在段中的位置。 添加配置选项max_total_...
Statman 使用内存中的 ETS 表来实现低开销日志记录并避免单进程瓶颈。 请参阅下面的“它是如何工作的”。 集成选项: :实时(移动友好)网络仪表板。 公开一个小型 Web 应用程序和一个 HTTP API,其中 Munin(包括...
请求记录-查看某些请求记录的所有内容 应用程序-查看,过滤和搜索当前节点中的应用程序 流程-查看,过滤和搜索当前节点中的流程 端口-查看,过滤和搜索当前节点中的端口(负责I / O) 套接字-在当前节点中查看,...
- 具有广泛功能集的流行日志记录框架 - OTP 21+ 内置可插拔记录器模块 - Elixir 的内置可插入记录器模块,在最近的 Elixir 版本中也与 Erlang 的logger模块同步 - 与 systemd 集成的库,它提供了与 systemd 的...
概述1:wq erlyThing 是一个用 Erlang 编写的去中心化、分布式基于消息的事物平台。特征去中心化系统。 通过消息进行通信的分布式系统在运行时启动和停止事物事物理解的消息的配置配置文件的动态处理(things.config ...
啤酒商lagerist是围绕lager日志记录框架( )的精简包装。 它添加/更改了几件事: 日志组的概念,可以即时打开/关闭标签的概念方便宏无需解析转换即可工作安装 git clone git@github....
牛仔骨头古腾堡发电机Gutenberg 生成器,用于创建带有模板、i18n、日志记录、JSON 支持的 Cowboy (2.0.0 pre1) 应用程序,以及使用 Bootstrap 进行 UI 格式设置的示例页面。 请求处理程序将尊重text/html和...
它旨在优雅地处理监督树可能发生的实际故障情况(例如消耗所有CPU时间以不断重启死服务),同时也对“服务”代码没有不必要的要求,并提供挂钩来执行适当的操作在生产环境中进行日志记录。 。 完全覆盖了该模块,...
erlang 平台的日志记录应用程序。 主要特点 - 1> 非常易于使用和配置。 2> 运行时可配置。 4> 多个日志级别 - 紧急、警报、严重、错误、警告、通知、信息、调试、控制台 5> 系统日志支持 (RFC-3164)
sasl_syslog 此 OTP 应用程序提供了一个 error_logger 报告处理程序,该处理程序使用 UDP 将消息转发到系统日志中继/收集器。 它实现了 RFC5424 syslog 消息格式和 GELF。 由 syslog-ng(自 3.0 版起)和 rsyslogd ...
会话日志第 0 节 (2015-04-15) 持续时间:1 小时(未记录) 展示了一些基本的 Erlang/Elixir 语义和 Elixir 语法。 链接:第一节 (2015-05-20) 持续时间:2.5 小时命令行历史: /priv/history/session1.history 代码...
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由...