Простой класс на ActionScript 3 для логирования

18.06.2011 12:17 / Артём Волк / 539 просмотров / ...

Для ActionScript 3 существует несколько фреймворков для логирования. К сожалению, один из них требует подключения компонентов от Flex'а, другие слишком велики для небольших проектов. Есть так же удобные решения для AIR.

Для небольших проектов достаточно, в принципе, вывода отладочных сообщений с помощью trace(), эти сообщения можно посмотреть на живом сайте с помощью отладочной версии Flash-плеера и/или с помощью Vizzy.

Небольшой класс-обёртка над trace() умеет следующее:

  • Вывод сообщений с разными статусами (отображаются первым символом)
  • Встроенный sprintf()
  • Отображение результата вызова getTimer() (для быстрого профилирования)
  • Возможность отображения вложенных полей объектов (т.н. deep trace)

Внутри используется реализация sprintf() от Manish Jethani

package crisp.log
{
	import va.routine.sprintf.*;
	import flash.utils.*;

	public class Logger
	{	
		private static const INFO_MARK:String = '-';
		private static const WARN_MARK:String = '*';
		private static const ERROR_MARK:String = '!';

		public static function info(message:String, ... args):void
		{
			_message(message, args, INFO_MARK);
		}

		public static function warn(message:String, ... args):void
		{
			_message(message, args, WARN_MARK);
		}

		public static function error(message:String, ... args):void
		{
			_message(message, args, ERROR_MARK);
		}

		/*
			http://www.actionscript.org/forums/showthread.php3?t=158117
		*/
		public static function objectDeepTrace( obj : *, level : int = 0 ) : void{
			var tabs : String = "";
			for ( var i : int = 0 ; i < level ; i++, tabs += "\t" );

			for ( var prop : String in obj ){
				trace( tabs + "[" + prop + "] -> " + obj[ prop ] );
				objectDeepTrace( obj[ prop ], level + 1 );
			}
		}

		/*
			http://www.kirupa.com/forum/showthread.php?p=1923917
		*/
		public static function objectTrace(object:*)
		{
			var item:String;
			for (var key:String in object)
			{
				item = '[' + key + ']' + " -> ";

				if (object[key] instanceof Array)
				{
					item += 'Array(' + object[key].length + ')';
				}								
				else
				{
					item += object[key];
				}

				trace(item)
			}
		}

		private static function _message(message:String, args:Array, mark:String):void
		{
			var ms:String = sprintf('[%10.0f]', getTimer());
			var message:String = vsprintf(message, args);
			trace(sprintf("%s %s %s", mark, ms, message));
		}			
	}
}

Скачать полный исходный код.