之前自己在多个项目中总结了一个log framework,暂时就叫GLLog吧。我觉得很多跟AS3相关的,特别是flex或AIR,需要一个log framework来定义输出信息。flex framework本身也带了个,就是稍显简单。
既然讲到定义输出信息,就不得不考虑目标的多样性,比如trace,普通文本,TextArea,XML,或者远程计算机等等。数是数不过来的,这就需要分离具体实现。
不过在实践过程中,我还发现,输出目标和文本格式最好也分离。比如一行一行的log信息,既可以放到文本文件里,也能显示在TextArea组件中;又如XML格式的log,可以放到本地XML文件,也可以作为dataprovider绑定到某个flex组件中。除此以外,还有一个好处就是,可以将存储和显示分离。格式化的log信息被存储在内存中,按照用户需要才显示或者写入文件。
为了做到让GLLog framework尽量简单和通用,我决定将输出目标排除在外(毕竟种类太过繁多),只提供获得格式化log的接口。
下面是GLLog framework的一个大致结构。
接口GLIWriter就定义了格式化方式(它将会被添加到GLLog并负责格式化信息)。以我自己写的GLPureWriter为例,它的作用就是把log一行一行的窜成字符串(注意:并没有声明输出到哪里)。
package org.gainloss.log
{
import flash.events.Event;
import flash.events.EventDispatcher;
/**
* only pure list
*/
public class GLPureWriter extends EventDispatcher implements GLIWriter
{
public function GLPureWriter()
{
//TODO: implement function
}
private var _list:String = "";
public function pushMsg(msg:String):void
{
//TODO: implement function
_list += msg+"\n"
this.dispatchEvent(new Event("NEWLISTMSG"));
}
[Bindable(name="NEWLISTMSG")]
public function get wholeMsgs():Object
{
//TODO: implement function
return _list;
}
}
}
如果要输出到TextArea显示,可以这么做。
<?xml version="1.0" encoding="utf-8"?>
<mx:Window xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="300">
<mx:Script>
<![CDATA[
import org.gainloss.log.*;
[Bindable]
private var writer:GLPureWriter = GLLog.getWriterInstance(GLPureWriter) as GLPureWriter;
]]>
</mx:Script>
<mx:VBox [...]