Austin Kottke's Code Site

Thoughts about Architecture – Java, C/C++, JS, Objective-C, Swift, Groovy, Grails, (RIP Flash)

December 16th, 2010

Actionscript Logger class with filtering

actionscript, flash, logger, by austin.

Well, Ive used this logger a million times and thought it would be useful to let others take a look. The main thing this class supports is FILTERING, which is something that a lot of log classes do not have which I find problematic when dealing with a very large project or want to debug on a live server.

Check it out:

package com.adk.util {
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.utils.*;

/**=======================================================================
*
* Generic logger that provides filtering so you can specify exactly
* classes that should be traced out. You do this by adding in a filter
* for a specific class using the logger xml file.
*
* NOTE:
*
* Load in the logger xml file by listening for the LOADED event
* before dispatching and using logging statements.
*
* @example
*
*         var logger:FlashLogger = FlashLogger.getLogger( this, “path.to/logger.xml” );
*             logger.addEventListener( FlashLogger.LOADED, onLoggerLoad );
*
*        public function onLoggerLoad( event:Event ):void
*        {
*            var logger:FlashLogger = FlashLogger.getLogger( this );
*            logger.debug(“Test”, “param2”);
*        }
*
*
* Specify log filters in logger.xml:
*
* <?xml version=”1.0″ ?>
* <Logger logLevel=”DEBUG”>
* <filters>com.adobe, com.adk.util</filters>
* </Logger>
*
* You can add as many filters you want and specify the log level.
*
* @author Austin Kottke
*=======================================================================*/

public class FlashLogger extends EventDispatcher {

/*============================================================================
* Events and log types.
*============================================================================*/
public static var NONE : uint = 0;
public static var INFO : uint = 1;
public static var DEBUG : uint = 2;
public static var WARN : uint = 3;
public static var ERROR : uint = 4;
public static var FATAL : uint = 5;

/*============================================================================
* Variables
*============================================================================*/

public static var LOG_TYPES : Array;
private static var logLevel : int;
private static var filters : Array = new Array();
private static var filtersLoaded : Boolean = false;
private static var created : Boolean = false;
public var className : String ;

/*============================================================================
* EVENTS
*============================================================================*/
public static var LOADED : String = “xmlLoaded”;

/**********************************************************************************
* Adds in a new filter
*
* @param aString Adds in a new filter for the logger.
**********************************************************************************/

public function addFilter( aString : String ) {
FlashLogger.filters.push(aString);
trace(“FlashLogger.addFilter(” + aString + “)”);
}

/**********************************************************************************
* Checks if the class is in the filter.
*
* @return true or false if the class is in the filter or if there are no filters.
**********************************************************************************/

private function isClassInFilter( aClassName : String ) : Boolean {
for ( var i : Number = 0;i < filters.length;i++ )
if ( aClassName.indexOf(filters[i]) >= 0 ) return true;

if ( filters.length == 0 ) return true;

return false;
}

/**********************************************************************************
*  Constructor
**********************************************************************************/

public function FlashLogger( aClassName : String, loggerXMLPath : String ) {
className = aClassName;
if ( !created ) {
FlashLogger.LOG_TYPES = new Array(“NONE”, “INFO”, “DEBUG”, “WARN”, “ERROR”, “FATAL”);
setLogLevel(DEBUG);
created = true;
loadLogXml(loggerXMLPath);
}
}

/**********************************************************************************
*  Sets the log level
*
* @param aLogLevel the log level for debugging purposes
**********************************************************************************/

public function setLogLevel( aLogLevel : uint ) {
logLevel = aLogLevel;
trace(“FlashLogger.setLogLevel(” + FlashLogger.LOG_TYPES[aLogLevel] + “)”);
}

public function getLogLevelByName( aLogLevelName : String ) : Number {
for ( var i : Number = 0;i < FlashLogger.LOG_TYPES.length;i++ ) {
var curLevel : String = FlashLogger.LOG_TYPES[i].toLowerCase();
if ( curLevel.indexOf(aLogLevelName.toLowerCase()) >= 0 )
return i;
}
return 1;
}

/**********************************************************************************
*  Retrieves the logger
*
* @param className The class name for the logger to be debugged correctly.
**********************************************************************************/

public static function getLogger( obj : Object, loggerXMLPath : String = “logger.xml”) : FlashLogger {
var className : String = getQualifiedClassName(obj).split(“::”).join(“.”);
var logger : FlashLogger = new FlashLogger(className, loggerXMLPath);
return logger;
}

/**********************************************************************************
* Load in the xml configuration for the flash logger. By default this
* is logger.xml
**********************************************************************************/

private function loadLogXml( aPath : String = “” ) : void {
var url : URLLoader = new URLLoader();
url.addEventListener(Event.COMPLETE, loadLogFilters);
url.load(new URLRequest(aPath));
}

/**********************************************************************************
* Sets the filters based on the xml file.
**********************************************************************************/

private function loadLogFilters( event : Event = null ) : void {
try {
var loggerConfig : XML = new XML(event.target.data) ;
var filters : Array = loggerConfig.filters.split(” “).join(“”).split(“,”);
var logLevel : String = loggerConfig.@logLevel;
setLogLevel(getLogLevelByName(logLevel));

for ( var i : Number = 0;i < filters.length;i++ ) {
addFilter(filters[i]);
}
filtersLoaded = true;
this.dispatchEvent(new Event(LOADED));
}
catch (e : Error ) {
trace(“FlashLogger [ERROR] error loading filters: ” + e.message);
}
}

/**********************************************************************************
*  Ouputs a debug message.
*
* @param message The message to output
**********************************************************************************/

public function debug(…paramaters) : void {
if ( logLevel == NONE ) return;

if ( isClassInFilter(className) ) outputLogging(DEBUG, paramaters.join(“, “));
}

/**********************************************************************************
*  Ouputs an info message.
*
* @param message The message to output
**********************************************************************************/

public function info(…paramaters) : void {
if ( logLevel == NONE ) return;

if ( isClassInFilter(className) ) outputLogging(INFO, paramaters.join(“, “));
}

/**********************************************************************************
*  Ouputs an error message.
*
* @param message The message to output
**********************************************************************************/

public function error(…paramaters) : void {
if ( logLevel == NONE ) return;

if ( isClassInFilter(className) ) outputLogging(ERROR, paramaters.join(“, “));
}

/**********************************************************************************
*  Core trace output
*
* @param logLevel The log level to output
* @param message The message to display
**********************************************************************************/

private function outputLogging( logLevel : int, message : String ) {
if ( !filtersLoaded ) {
trace(“FlashLogger [ERROR] – please load in logger.xml before using this logger.”);
return;
}
var my_date : Date = new Date();
var hours:String = my_date.hours.toString();
var minutes:String = my_date.minutes.toString();
var seconds:String = my_date.seconds.toString();

if( my_date.hours < 10 ) hours = “0” + hours;
if( my_date.minutes < 10 ) minutes = “0” + minutes;
if( my_date.seconds < 10 ) seconds = “0” + seconds;

var time : String = hours + “:” + minutes + “:” + seconds;
trace(“[” + time + “] [” + FlashLogger.LOG_TYPES[logLevel] + “] (” + className + “) ” + message);
}
}
}

Please follow and like us:
0

Back Top

Leave a Reply

Your email address will not be published. Required fields are marked *

*