Flex应用程序调试基础--日志信息

来源:互联网 发布:js调用手机重力感应 编辑:程序博客网 时间:2024/06/05 15:02

对于任何软件开发人员来说,跟踪调试都是每日的必修课。通过跟踪调试,不仅可以掌握程序在特定运行阶段的状态信息,通过这些信息来判断程序运行是否 正常,而且还可以通过跟踪调试揪出当前应用程序的臭虫(Bug),谁也不能保证自己编写的程序没有任何问题,在运行时会一切正常,当程序运行出现异常时, 最常见做法是开发人员根据直觉或记录的日志来判断问题大概在什么地方,然后是打开程序,以调试方式运行,跟踪断点,逐步逼近,最终找到问题所在并修复。总 的来说,跟踪调试的知识虽然不像数据结构和算法这种知识对程序核心的组成影响那么大,但它确实保证最终产生高质量软件产品的非常重要的一环。掌握特定开发 环境下跟踪调试的知识对开发人员来说就是一瑞士军刀,往往在关键时刻能发挥重要的作用。

本教程将会介绍Flex应用程序开发过程中所需要的基本调试知识,包括一些特定场合下如何进行跟踪调试的技巧。除此之外,还会介绍一些有助于跟踪调试的第三方工具,若能在实际开发中灵活运用这些工具,相信将得到事半功倍的效果。

在Flex应用程序开发中,跟踪调试可以大致分为三类(本教程主要是讲解第一部分):

  1. 静态日志分析,通常是通过查看分析程序运行过程中记录下的日志文件或打印出来日志信息来判断程序的运行状态。具体内容请查看下面讲解的内容。
  2. 代码跟踪调试,在程序开发过程中,通常借助集成开发工具(IDE)提供的功能,深入到程序内容,通过对断点进行跟踪调试来达到观察程序状态或修复Bug的目的。后续教程会详细讲到。
  3. 动态监测分析,通常是借助第三方监测工具,在程序运行中实时观测通讯中的数据来判断程序的运行状态。后续教程会详细讲到。

1. 日志生成与分析

在Flex中,标准的记录日志有两种方式:

  1. 通过trace()全局函数直接输出调试信息
  2. 通过Flex内置的日志API来记录日志

1.1 trace()应用

对于大多数Flex开发的新手来说,使用trace()来输出调试信息应该是最为简单也最为常见的了,trace()是一个全局函数,其方法签名如下所示:

public function trace(... arguments):void

trace()函数可接受一个或多个参数,若参数中含有非String的数据类型,trace()函数会自动调用该数据类型相关的 toString()方法,trace()的结果字符串通常直接被输出到调试控制台显示。例如,在按钮的鼠标点击事件处理函数中可以通过如下代码的方式输出。

trace()用法示例

private function mouseClickHandler(event:MouseEvent):void {trace("调试信息:" + event.target.toString());}

需要注意的是不少初学者喜欢调用Alert.show(“xxx‘)来显示调试信息,在实际开发中不推荐这种非标准的调试方式,因为这种方式不仅不能接受多个参数传入,而且也不支持日志写入本地文件的操作(关于日志写入本地文件的方法请查看1.2节)

1.2 应用内置API记录日志信息

尽管trace()简单易用,但在很多时候它并不能满足程序日志记录分析的要求,比如说,不能进行日志分级过滤,也没有提供添加时间戳的功能,在实际应用开发中,往往会使用Flex内置的专门用来记录日志的API。

Flex内置日志系统的相关类与接口可以在包mx.logging下找到,在程序中应用日志API记录日志需要了解两个概念:日志记录器与日志记录器目标。

日志记录器:所有日志记录器必须实现ILogger接口,其主要作用是将日志信息发送给日志记录器目标。 日志记录器目标:所有日志记录器目标必须实现ILoggingTarget接口,通常负责日志的格式化、过滤并输出。在实际开发中,更常见的是直接使用或 扩展ILogginTarget的实现类TraceTarget,TraceTarget提供了更丰富的日志功能,它也是全局trace()方法的日志记 录器目标。

记录日志通常包括以下几个步骤:

  1. 创建日志记录器目标。
  2. 调用mx.loggin.Log类的静态方法addTarget()加日志记录器目标加入日志系统。
  3. 通过Log类静态方法getLogger()得到指定类别相关联的日志记录器。
  4. 通过第3步得到的日志记录器写入不同等级的日志信息。

对照以上步骤的描述,来看一个示例,请看如下代码。

LoggingAPIBasicExample

minHeight="600" minWidth="955" xmlns:fx="http://ns.adobe.com/mxml/2009"xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:s="library://ns.adobe.com/flex/spark"creationComplete="onCreationComplete()"> horizontalAlign="center" verticalAlign="middle" />import mx.events.FlexEvent;import mx.logging.ILogger;import mx.logging.Log;import mx.logging.LogEventLevel;import mx.logging.targets.TraceTarget;private var logger:ILogger;protected function onCreationComplete():void {//将日志记录器目标加入日志系统Log.addTarget(traceTarget);//得到相关联的日志记录器logger = Log.getLogger("MyClass");}protected function sendBtnId_clickHandler(event:MouseEvent):void {//通过日志记录器记录日志logger.debug("The type of event is: {0}" , event.type);logger.debug("The type of event is: {0}" , event.target.toString());}]]> id="traceTarget" includeDate="true" includeCategory="true" includeTime="true" includeLevel="true" /> id="sendBtnId" click="sendBtnId_clickHandler(event)" label="Send" />

程序中我们仅仅创建了一个按钮,在按钮点击的事件处理函数中希望将事件的类型记录进日志系统。可以注意到,我们使用元标签的方式创建了日志记录器目标traceTarget,当应用程序初始化完成后,我们又通过addTarget()将 traceTarget加入日志系统,当然,最关键的一点是我们通过日志记录器logger来记录日志。

以调试方式运行程序,观察控制台输出信息如下。

5/22/2011 23:50:27.816 [DEBUG] MyClass The type of event is: click

为了完全明白这里输出信息的内容,还有几点需要交待,在创建traceTarget的时候,我们还为其设置了几个用来控制日志格式化及过滤的属性,程序中代码的设置与最终输出日志信息关联如下图所示。


输出日志信息组成部分

其中需要注意的是,这里的[DEBUG]输出,这是由于我们在记录日志时通过调用logger.debug()方法来指定日志的等级为调试级别,除 此之外,在记录日志的时候还可以指定其它不同等级的日志,日志可设定的等级可查看mx.loggin.LogEventLevel类,通过官方语言参考手 册可以查看到日志的等级共分为6种,按等级从低到高,用常量(以int类型数字来表示等级高低,数字越高表示等级越高)来表示分别为:

  • LogEventLevel.ALL:0,表示让目标处理所有日志消息。
  • LogEventLevel.DEBUG:2,表示对调试非常有帮助的日志消息。
  • LogEventLevel.INFO:4,表示一些指示应用程序运行状况的重要日志消息。
  • LogEventLevel.WARN:6,表示一些可能会对应用程序造成损害的日志消息。
  • LogEventLevel.ERROR:8,错误事件日志消息,程序仍然可以继续运行。
  • LogEventLevel.FATAL:1000,影响严重,可能导致应用程序崩溃的致命错误日志消息。

有了这些等级区分,我们还可以通过指定日志记录器目标的level属性来控制哪些等级的日志消息被记录,指定的等级越高,则低于此等级的日志将不会被记录,例如,对于代码清单8-2的示例来说,若在将日志记录器目标被加入日志系统之前我们添加如下设置:

traceTarget.level = LogEventLevel.INFO;

会发现,程序中通过logger.debgu()记录的日志将不会在控制台显示出来。若不为日志记录器目标设定过滤的日志等级,默认是LogEventLevel.ALL,即全部日志均会被记录。

有了日志不同等级的区分,你可以设定不同输出的条件来过滤日志信息。

1.3 查看日志信息

日志要能正常输出显示,需要运行Adobe Flash Player的调试版本,可以访问以下网址来查看当前浏览器所使用的Adobe Flash Player版本及如何下载Adobe Flash Player:

http://www.playerversion.com/

大多数情况下,当我们以调试方式运行Flex应用程序时,直接在Flash Builder控制台查看输出的日志信息即可。除此之外,Adobe还提供了将日志以本地文件的方式记录下来的方式,以供查看分析。

记录与查看日志有下面两步:

(需要注意,下面关于路径中username的部分需要根据每个人系统设置的不同作相应更改)

  1. 创建mm.cfg文件。

为了记录日志文件,我们需要手动创建mm.cfg文件,该文件存放的位置针对不同操作系统有所不同,从Adobe Flash Player10.1之后,mm.cfg在不同操作系统中创建的位置如下所示。

Mac OSX系统:默认Adobe Flash Player会去检查home目录(~),如果未找到,则会去“/Library/Application Support/Macromedia‘目录下查找该文件。 Linux系统:在“/home/username‘目录创建。 Windows系统:Windows2000/XP,mm.cfg默认应该位于“c:Documents and settingsusername‘目录下,Windows7/Vista默认应该位于“c:Usersusername‘目录下。

mm.cfg的文件内容通常如下:

ErrorReportingEnable=1TraceOutputFileEnable=1MaxWarnings=0

ErrorReportingEnable:指定是否允许向日志文件中写入错误信息,该值为1表示允许写入,为0表示不允许写入。默认值为0。 TraceOutputFileEnable:指定是否允许向日志文件中写入trace信息,该值为1表示允许写入,为0表示不允许写入。默认值为0。 MaxWarnings:指定允许写的是警告信息条数。默认值为100,表示当写入100条信息过后,更多的错误信息将溢出,被忽略。将该设为0,表示对写入信息的条数无限制。

  1. 查看日志信息。

当正常创建并设定mm.cfg后,当以Adobe Flash Player的调试版本来运行应用程序时,所有相关的日志信息将自动记录至flashlog.txt文件,该文件在不同的操作系统位置有所不同。

  • Mac OSX系统:该文件全路径为“/Users/username/Library/Preferences/Macromedia/Flash Player/Logs/flashlog.txt‘
  • Linux系统:该文件全路径为“/home/username/.macromedia/Flash_Player/Logs/flashlog.txt‘
  • Windows XP及以前版本:该文件全路径为“C:Documents and SettingsusernameApplication DataMacromediaFlash PlayerLogsflashlog.txt‘
  • Windows 7/Vista:该文件全路径为“C:UsersusernameAppDataRoamingMacromediaFlash PlayerLogsflashlog.txt‘

至Flash Player 9更新之后,日志文件存放的文件名及路径不能进行自定义更改,而在此之前,还可通过在mm.cfg里配置TraceOutputFileName参数来自定义日志文件名及路径。

你当然可以通过文本编辑软件打开falshlog.txt查看日志,但最好的办法在当你运行程序时实时监测flashlog.txt文件的输出,这在Mac OSX/Linux及Windows中有所不同。

在Mac OSX/Linux系统中,可以直接通过shell命令:

tail -f flashlog.txt

来实时监测该文件,当使用Adobe Flash Player调试版本来运行程序时,在命令终端将实时输出日志信息。

而在Windows系统中,因为没有tail类似命令,因此需借助其它手段来实时监测该日志文件。一种方式是在Windows中安装Cygwin, 这相当提供了类似unix环境的支持,可以使用同样的tail命令来完成实时监测日志信息的要求。另外一种方式是借助第三方工具,这里向读者推荐一个工 具:BareTail,它提供了类似tail的文件实时监测的功能,在Windows下使用非常不错,其运行界面如下图所示。

BareTail运行界面

该工具有免费版本提供,可在如下地址找到介绍与下载:

http://www.baremetalsoft.com/baretail/index.php

关于后续善用第三方工具的教程,会涉及到几个好用的工具:SoapUI、Charles Proxy、AMF Explorer for Firefox/Flashbug,敬请关注