Erlang-China

erlang 中文社区

erl 的 log4*, bt 以及杂七杂八


etorrent 是最近相当活跃(常能在 maillist 见到 ann )的一个项目,它是用 erlang 实现的一个 bittorrent 客户端。记得刚刚接触 erlang 的时候就觉得它貌似很适合用来写 bittorrent 客户端(分布式/TCP/并发),深入了解一番了之后,又觉得比起 C 来 erlang 并没有太明显的优势(GUI/CPU Heavy/IO/File),加之后来见到堪称完美的 uTorrent 横空出世(说实话,除了网上银行,唯一想让我回到 windows 平台的东西就是它了)让人不再有动力作“写 torrent 客户端”之想,没想到时隔一年,还真见到了这样的项目,让人感慨。现在的 etorrent 已经是第二个公开发布的版本了,从它的 change log 看到,特性增强很厉害,以“ 20 个 torrent 占用 50-80M 内存”这样的指标来说,已经相当接近实用水平了。或许日后的 etorrent 再配上一个好用的 frontend 能够打造出像 xmms2 那样强大的软件也说不定呢。

log4erl 是一个 log4* 的 erlang 实现。对于广大习惯了 log4* 的 erlang 使用者来说,确是一个福音。不过,从某种程度上讲,这也可以算是某种“重复建设”—— erlang 自身已经内置了相当强大的日志机制。注意,只是强大,我并没有说易用。因为对于广大 log4* 爱好者们而言,只有能使用 grep/awk/perl 这些标准 unix tool chain 来处理的,格式化的,每条一行的(问题是,以我的经验来说,”每条一行”这种限制常常会逼人多费半天劲,或者多写一大堆)才是易用的日志。而 erlang 自身内置的日志机制说实话也毫不逊色,只是用来颇有一些不同(加之文档组织得别出心裁,让人不易找到),各自属于不同的风格。既被拔到了“风格”层面,也就参杂了情感因素,无法以简单的方式来区分高下(君不见 csdn 上 x vs y 的口水仗层出不穷无休无止?)。本是见仁见智的事,大家看个人的喜好各取所需就是了。

顺便说说 erlang 自身的日志机制,极简的例子看上去象这样:

下载: elog.config
%% text erorr log
[{kernel,
 
[{error_logger,
    {
file, "debug.log" }}]}].

这好比是 log 的配置文件,然后,这样用:

erl -config elog.config
1> error_logger:error_report([{tag1,data1},a_term,{tag2,data}]).
ok
2> error_logger:error_report("Serious error in my module").
ok
3> q().
ok

这样,在 debug.log 里面就有了:

$ more debug.log

=ERROR REPORT==== 17-Jul-2008::11:32:11 ===
    tag1: data1
    a_term
    tag2: data

=ERROR REPORT==== 17-Jul-2008::11:32:31 ===
Serious error in my module

差不多就是这样了,更多配置,相关工具,以及更 “The Erlang Way” 的用法,可以参看文档 SASL 的部分。

btw,升级 wp 时从 incoming link 里发现一个 “默默无闻的领悟Erlang传说” 的中文 blog ToQuick (图快?),主人 cheng 同学治“程”(程序)态度严谨,细密,文章写得勤也写的好,值得推荐。下面对于 log4erl 的代码观感就转自图快:

log4erl代码非常精简,保持了erlang代码的风格,log4erl包括1个supervisor和2个gen_server和1个gen_event。
log4erl.erl为gen_server和application behaviour的callback,其作为主要的module,
log4erl_sup.erl为supervisor,启动log4erl,初始时将通过log4erl_sup:add_file_logger启动default_logger 日志记录器。
log4erl_sup:add_file_logger/1会动态添加file_logger_guard和file_logger两个child process。

have fun.







Write a Comment

Note: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>