1
8
9 import com.sekati.events.Dispatcher;
10 import com.sekati.log.Inspector;
11 import com.sekati.log.LCBinding;
12 import com.sekati.log.LogEvent;
13 import com.sekati.time.StopWatch;
14
15
35 class com.sekati.log.Logger {
36
37 private static var _instance:Logger;
38 private var _levels:Object;
39 private var _filters:Array;
40 private var _proxyObj:Object;
41 private var _watch:StopWatch;
42 private var _logId:Number;
43
44 private var _isEnabled:Boolean;
45 private var _isOutputLC:Boolean;
46 private var _isOutputSWF:Boolean;
47 private var _isOutputIDE:Boolean;
48
49 public var trace:Function;
50 public var info:Function;
51 public var notice:Function;
52 public var status:Function;
53 public var warn:Function;
54 public var error:Function;
55 public var fatal:Function;
56
57
60 private function Logger() {
61 resetLevels( );
62 resetFilters( );
63 _proxyObj = new Object( );
64 _watch = new StopWatch( true );
65 _logId = 0;
66
67 _isEnabled = true;
68 _isOutputLC = false;
69 _isOutputSWF = false;
70 _isOutputIDE = false;
71 }
72
73
77 public static function getInstance():Logger {
78 if (!_instance) _instance = new Logger( );
79 return _instance;
80 }
81
82
86 public static function get $():Logger {
87 return Logger.getInstance( );
88 }
89
90
91
92
96 public function set enabled(b:Boolean):Void {
97 _isEnabled = b;
98 }
99
100
104 public function get enabled():Boolean {
105 return _isEnabled;
106 }
107
108
112 public function get _status():String {
113 return getLevels( ) + "\n" + getFilters( );
114 }
115
116
120 public function reset():Void {
121 setAllLevels( true );
122 resetFilters( );
123 }
124
125 public function set isLC(b:Boolean):Void {
126 _isOutputLC = b;
127 }
128
129 public function set isSWF(b:Boolean):Void {
130 _isOutputSWF = b;
131 }
132
133 public function set isIDE(b:Boolean):Void {
134 _isOutputIDE = b;
135 }
136
137
138
139
145 public function setLevel(level:String, isEnabled:Boolean):Void {
146 _levels[level.toLowerCase( )] = isEnabled;
147 }
148
149
154 public function setAllLevels(isEnabled:Boolean):Void {
155 for (var i in _levels) {
156 setLevel( _levels[i], isEnabled );
157 }
158 }
159
160
164 public function resetLevels():Void {
165 _levels = {trace:true, info:true, status:true, warn:true, error:true, fatal:true, object:true};
166 }
167
168
172 public function getLevels():String {
173 var a:Array = new Array( );
174 for (var i in _levels) {
175 a.push( i + ":" + _levels[i].toString( ) );
176 }
177 return "_levels={" + a.toString( ) + "};";
178 }
179
180
186 public function object(origin:Object, obj:Object):Void {
187 var insp:Inspector = new Inspector( obj, origin );
188 _output( "OBJECT", origin, insp );
189 }
190
191
192
193
199 public function setFilter(origin:Object, isFiltered:Boolean):Void {
200 if (isFiltered) {
201 filter( origin );
202 } else {
203 unfilter( origin );
204 }
205 }
206
207
211 public function getFilters():String {
212 return "_filters=[" + _filters.toString( ) + "];";
213 }
214
215
219 public function resetFilters():Void {
220 _filters = [];
221 }
222
223
228 public function isFiltered(origin:Object):Boolean {
229 var o:String = String( origin );
230 for (var i:Number = 0; i < _filters.length ; i++) {
231 if (_filters[i] == o) {
232 return true;
233 }
234 }
235 return false;
236 }
237
238
243 private function filter(origin:Object):Void {
244 var o:String = String( origin );
245 if (!isFiltered( o )) {
246 _filters.push( o );
247 }
248 }
249
250
255 private function unfilter(origin:Object):Void {
256 var o:String = String( origin );
257 for (var i:Number = 0; i < _filters.length ; i++) {
258 if (_filters[i] == o) {
259 _filters.splice( i, 1 );
260 break;
261 }
262 }
263 }
264
265
275
276
277 private function _output(level:String, origin:Object, msg:Object):Void {
278
279 if (_isEnabled == false || _levels[level] == false || isFiltered( origin ) == true || !(level.toLowerCase( ).indexOf( "__get__" ) <= -1)) {
280 return;
281 }
282 var benchmark:Number = _watch.lap( );
283 var id:Number = _logId++;
284 var e:LogEvent = new LogEvent( {id:id, type:level.toLowerCase( ), origin:String( origin ), message:String( msg ), benchmark:benchmark} );
285
286
287 if(_isOutputLC) {
288 LCBinding.send( e );
289 }
290
291 if(_isOutputSWF && !_isOutputLC) {
292 Dispatcher.$.dispatchEvent( e );
293 }
294
295 if(_isOutputIDE) {
296 trace( id +" " + level.toUpperCase( ) + "\t " + origin + "\t " + msg + "\t (" + benchmark + " ms)" );
297 }
298 }
299
300 public function setOutputMode(isLocal:Boolean, isRemote:Boolean, isIDE:Boolean):Void {
301 }
302
303
304
305
306 private function __resolve(name:String):Function {
307 if (name.indexOf( LogEvent.onLogEVENT ) > 1) {
308
309 return;
310 }
311 var f:Function = function():Object {
312 arguments.unshift( name );
313 return __proxy.apply( _proxyObj, arguments );
314 };
315 _proxyObj[name] = f;
316 return f;
317 }
318
319 private function __proxy(name:String):Void {
320 arguments.shift( );
321 var n:String = String( name ).toLowerCase( );
322 var o:String = String( arguments[0] );
323 var s:String = String( arguments[1] );
324 _instance._output( n, o, s );
325 }
326
327
331 public function destroy():Void {
332 _watch.destroy( );
333 LCBinding.disconnect( );
334 for(var i in _instance) {
335 delete _instance[i];
336 }
337 delete _instance;
338 }
339 }