2.5 JavaScript日志
作为Java开发人员,你肯定很熟悉一个叫做log4j的工具。Log4j是Apache基金会提供的一款日志实用工具,其网址是http://logging.apache.org/log4j/docs。Log4j的目标是成为一款强大的、简单易用的实用日志工具,允许开发人员在他们的代码中加入日志声明。它可以通过一个外部XML来配置日志属性,这就允许我们改变日志的配置而无需修改应用的源代码。日志会提供应用失败的具体上下文信息,这可以帮助我们进行调试,因为有时候调试分布式、远程或多线程应用非常困难甚至是不可能的。日志还可以用来实现审计功能。
长久以来,高质量开发工具和库的缺乏一直妨碍着JavaScript开发。有多少人为了调试JavaScript而在代码中到处编写alert语句?这种做法确实是有效的,但是alert语句的问题在于必须在应用公开发布之前删除它们。添加了大量的alert语句,没想到最后还要删除它们,这十分让人恼火,而且还容易出错。
新兴的工具正在不断地涌现出来,它们为JavaScript带来了log4j式的功能。在下面几节中,我们将介绍这些工具,并简单地展示它们的用法。
2.5.1 Log4JS
就像其网站上说的那样,Log4JS是在思想上与Apache的log4j类似的JavaScript日志记录工具。Log4JS把日志输出到一个可定制的日志类中。可以在http://log4js.sourceforge.net上找到它。
可以使用的日志类有四个:alert、write、popup和console。alert日志类把日志消息显示在警告对话框中。write日志类把日志写入浏览器的一个新的页面。popup日志类把日志写入一个单独的浏览器窗口,这有利于跟踪日志消息。最后,console日志类把日志写到Safari的控制台中,如果浏览器不是Safari,则把日志写入一个对话框。
Log4JS与log4j的相似之处在于它们都定义了不同的日志级别。Log4JS中的日志级别按照递增顺序依次是DEBUG、INFO、WARN、ERROR、FATAL和NONE。一个日志类只会记录与自己的级别相同或更高的信息。例如,如果一个日志类的级别是WARN,那么由info()方法产生的消息将不会被输出,但是由warn()、error()或fatal()方法产生的信息就会被输出。
如果你曾经使用过log4j,那么使用Log4JS就会非常简单。图2-14展示了用来演示Log4JS的简单测试。它是一个简单的页面,使用JavaScript来计算两个整数的和。Log4JS用来在脚本执行过程中记录日志消息。该页面的源代码展示在代码清单2-3中。
代码清单2-3 log4jsExample.html


图2-14 计算两数之和的简单页面
计算两个整数之和的JavaScript如代码清单2-4所示。这段脚本在一开始创建了两个全局日志类,一个具有info级别,另一个具有error级别。calculateSum函数先从输入框获取输入的值,然后使用Log4JS把输入的值记录到弹出式日志类中。接着,脚本尝试把输入值转换成整数。如果输入值中的一个或两个不是合法的整数,那么错误信息就会被写入popup日志类,并退出函数。最后,脚本把两个整数相加并把结果显示在页面上。
代码清单2-4 log4jsExample.js

本例中的日志消息被写入到popup日志类中,如图2-15所示。消息会追加到列表中,因此只要不关闭消息窗口,就能得到被记录的消息的完整历史。如果对脚本做了一些修改并且想看看由于这些修改脚本的行为发生了哪些改变的话,这个功能就很有用了。
Log4JS还包含记录对象属性的功能,这在调试中会非常有用。Log类公开了一个叫做dumpObject的静态函数,它会向日志类中写入一个对象的字符串形式:
![]()

图2-15 写到popup日志类中的日志消息
需要记住的是,把日志类的日志级别设置为NONE可以禁用日志类。在你的产品级应用中使用Log4JS的一种方法是在一个单独的JavaScript文件中定义应用所用到的所有日志类,这样就可以在所有页面中使用它们。在把应用部署到产品环境中时,只需更新这个JavaScript文件,禁用所有的日志记录即可。更进一步,你也可以使用Ant的replace任务根据执行构建类型的不同(开发、测试或产品)而设置日志级别。
2.5.2 Lumberjack
Lumberjack是另一款基于JavaScript的日志记录实用工具,其网址是http://gleepglop.com/ javascripts/logger。和Log4JS一样,Lumberjack也受到了Apache log4j的启发。
Lumberjack与其他JavaScript日志框架的不同之处在于它显示日志信息的方法。Lumberjack把所有的日志信息都写入一个特殊的窗口,使用Alt+D(在Mac OS X上是Cmd+D)组合键可以激活这个窗口。这个输出窗口是一个显示在网页底部的浮动窗口,即使在上下滚动网页的时候,它的位置也不会改变。这个输出窗口还包含一个基于正则表达式的过滤器,所以只会显示指定类型的错误。同时,它还包含一个JavaScript命令行,可以在其中输入JavaScript命令。
Lumberjack需要Prototype库
Lumberjack依赖于JavaScript库Prototype,可以在http://prototype.conio.net上找到这个库。由于这种依赖性,当在HTML页面中使用<script>标签分别引入它们的JavaScript文件时,一定要把Prototype列在Lumberjack之前。浏览器会根据JavaScript文件在HTML页面中列出的顺序读取并执行它们。如果把Lumberjack列在Prototype之前,那么当浏览器尝试执行Lumberjack脚本的时候就会发生错误,因为找不到未被执行的Prototype脚本中的值。
与使用Log4JS时需要创建单独的日志类不同,Lumberjack把所有的日志方法都作为Logger类的静态方法公开。Logger类共公开了4个日志方法:info、debug、warning和error。每个方法都接受一个代表被记录信息的字符串参数。Logger类还公开了一个log方法,它接受两个参数:代表被记录信息的字符串和代表日志级别的字符串。
让我们重用Log4JS的例子来演示Lumberjack的使用方法。正如能从代码清单2-5中看到的那样,JavaScript代码几乎和Log4JS例子中的脚本一模一样。在这个例子中,代码顶部不再有两个全局定义的日志类。另外,每个日志声明现在使用Logger类的静态方法把日志信息写入到输出。请注意Logger类的静态方法是如何用来写入日志信息的。
代码清单2-5 lumberjackExample.js


图2-16展示了Lumberjack的输出窗口。请记住,使用Alt+D(在Mac OS X上是Cmd+D)组合键可以触发输出窗口。将与Log4JS例子中相同的日志信息写到输出窗口中,并且信息的颜色根据类型的不同而不同,错误是红色,报告信息是白色。输出窗口的顶部是供用户输入过滤信息的文本框。可以输入error只显示错误信息,或输入error|warning只显示错误和警告。
Lumberjack提供了一个十分方便的查看JavaScript对象的方法。对象的属性会被写入输出窗口。想要查看一个JavaScript对象,只需打开Lumberjack输出窗口,输入如下代码,再按Enter键即可:
![]()
或者,也可以把一个代表页面中DOM对象ID的字符串传入这个查看方法。例如,如果想查看图2-16中页面上的第一个输入框,可以在Lumberjack的命令行界面中输入如下代码再按Enter键:
![]()
这会把输入框的所有属性显示到输出窗口中。

图2-16 Lumberjack把日志信息写入页面底部的一个浮动窗口中







