+ Since version 1.4.10, log4javascript comes with AMD support hence can be loaded by a script
+ loader such as RequireJS.
+
+
+ The current version of JavaScript is designed only to run in a browser. If not using AMD,
+ log4javascript creates a single property of the global object (to all intents and purposes, a
+ global variable) called log4javascript.
+
All of log4javascript's instantiable classes are accessible via the log4javascript object, which
- acts as a namespace. Therefore references to all class names must be preceded with "log4javascript.".
- For example:
+ acts as a namespace. Therefore references to all class names must be preceded with
+ "log4javascript.". For example:
var popUpAppender = new log4javascript.PopUpAppender();
@@ -287,11 +304,17 @@
Methods
getDefaultLogger
Logger getDefaultLogger()
- Convenience method that returns the default logger. The default logger
- has a single appender: a PopUpAppender
- with the default layout, width and height, and with focusPopUp set to false
- and lazyInit, useOldPopUp and
- complainAboutPopUpBlocking all set to true.
+
+ Convenience method that returns the default logger. In the standard edition, the
+ default logger has a single appender: a
+ PopUpAppender with the default layout,
+ width and height, and with focusPopUp set to false and
+ lazyInit, useOldPopUp and
+ complainAboutPopUpBlocking all set to true.
+
+
+ In the production edition, the default logger has no appenders.
+
@@ -601,7 +624,7 @@
Logger methods
getAdditivity
-
Level getLevel()
+
Boolean getAdditivity()
Returns whether additivity is enabled for this logger.
diff --git a/js/console_uncompressed.html b/js/console_uncompressed.html
index 55679f8..fffe334 100644
--- a/js/console_uncompressed.html
+++ b/js/console_uncompressed.html
@@ -162,7 +162,7 @@
}
} else {
var groupElementContainer = this;
-
+
this.mainDiv = document.createElement("div");
this.mainDiv.className = "group";
@@ -174,7 +174,7 @@
this.expander.unselectable = true;
var expanderText = this.group.expanded ? "-" : "+";
this.expanderTextNode = this.expander.appendChild(document.createTextNode(expanderText));
-
+
this.headingDiv.appendChild(document.createTextNode(" " + this.group.name));
this.contentDiv = this.mainDiv.appendChild(document.createElement("div"));
@@ -632,7 +632,7 @@
rootGroup = new Group("root", true);
rootGroup.render();
currentGroup = rootGroup;
-
+
setCommandInputWidth();
setLogContainerHeight();
toggleLoggingEnabled();
@@ -757,9 +757,9 @@
function LogItemContentReverser() {
}
-
+
LogItemContentReverser.prototype = new LogItemVisitor();
-
+
LogItemContentReverser.prototype.visitGroup = function(group) {
group.reverseChildren();
this.visitChildren(group);
@@ -1779,10 +1779,10 @@
if (!Array.prototype.push) {
Array.prototype.push = function() {
- for (var i = 0, len = arguments.length; i < len; i++){
- this[this.length] = arguments[i];
- }
- return this.length;
+ for (var i = 0, len = arguments.length; i < len; i++){
+ this[this.length] = arguments[i];
+ }
+ return this.length;
};
}
@@ -2130,7 +2130,7 @@
span.pre {
white-space: pre;
}
-
+
pre.unwrapped {
display: inline !important;
}
diff --git a/js/liteconsole_uncompressed.html b/js/liteconsole_uncompressed.html
index df5275f..202b56a 100644
--- a/js/liteconsole_uncompressed.html
+++ b/js/liteconsole_uncompressed.html
@@ -123,7 +123,7 @@
font-family: tahoma, verdana, arial, helvetica, sans-serif;
overflow: hidden;
}
-
+
div#toolbar {
border-top: solid #ffffff 1px;
border-bottom: solid #aca899 1px;
diff --git a/js/log4javascript.js b/js/log4javascript.js
index 2b8424e..64201cc 100644
--- a/js/log4javascript.js
+++ b/js/log4javascript.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,20 +15,20 @@
*/
-if(!Array.prototype.push){Array.prototype.push=function(){for(var i=0,len=arguments.length;i0){var firstItem=this[0];for(var i=0,len=this.length-1;i2)?itemsAfterDeleted=argumentsArray.slice(2).concat(itemsAfterDeleted):itemsAfterDeleted;for(i=0,len=itemsToAppend.length;i=0){arr.splice(index,1);return true;}else{return false;}}
function array_contains(arr,val){for(var i=0,len=arr.length;i=level.level;}};Level.ALL=new Level(Number.MIN_VALUE,"ALL");Level.TRACE=new Level(10000,"TRACE");Level.DEBUG=new Level(20000,"DEBUG");Level.INFO=new Level(30000,"INFO");Level.WARN=new Level(40000,"WARN");Level.ERROR=new Level(50000,"ERROR");Level.FATAL=new Level(60000,"FATAL");Level.OFF=new Level(Number.MAX_VALUE,"OFF");log4javascript.Level=Level;function Timer(name,level){this.name=name;this.level=isUndefined(level)?Level.INFO:level;this.start=new Date();}
@@ -72,12 +65,12 @@ var loggingEvent=new LoggingEvent(this,new Date(),level,messages,exception);this
this.name+" is not an instance of log4javascript.Level");}};this.getLevel=function(){return loggerLevel;};this.getEffectiveLevel=function(){for(var logger=this;logger!==null;logger=logger.parent){var level=logger.getLevel();if(level!==null){return level;}}};this.group=function(name,initiallyExpanded){if(enabled){var effectiveAppenders=this.getEffectiveAppenders();for(var i=0,len=effectiveAppenders.length;i0)?args:["Assertion Failure"];args.push(newLine);args.push(expr);this.log(Level.ERROR,args);}};this.toString=function(){return"Logger["+this.name+"]";};}
-Logger.prototype={trace:function(){this.log(Level.TRACE,arguments);},debug:function(){this.log(Level.DEBUG,arguments);},info:function(){this.log(Level.INFO,arguments);},warn:function(){this.log(Level.WARN,arguments);},error:function(){this.log(Level.ERROR,arguments);},fatal:function(){this.log(Level.FATAL,arguments);},isEnabledFor:function(level){return level.isGreaterOrEqual(this.getEffectiveLevel());},isTraceEnabled:function(){return this.isEnabledFor(Level.TRACE);},isDebugEnabled:function(){return this.isEnabledFor(Level.DEBUG);},isInfoEnabled:function(){return this.isEnabledFor(Level.INFO);},isWarnEnabled:function(){return this.isEnabledFor(Level.WARN);},isErrorEnabled:function(){return this.isEnabledFor(Level.ERROR);},isFatalEnabled:function(){return this.isEnabledFor(Level.FATAL);}};Logger.prototype.trace.isEntryPoint=true;Logger.prototype.debug.isEntryPoint=true;Logger.prototype.info.isEntryPoint=true;Logger.prototype.warn.isEntryPoint=true;Logger.prototype.error.isEntryPoint=true;Logger.prototype.fatal.isEntryPoint=true;var loggers={};var loggerNames=[];var ROOT_LOGGER_DEFAULT_LEVEL=Level.DEBUG;var rootLogger=new Logger(rootLoggerName);rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);log4javascript.getRootLogger=function(){return rootLogger;};log4javascript.getLogger=function(loggerName){if(!(typeof loggerName=="string")){loggerName=anonymousLoggerName;logLog.warn("log4javascript.getLogger: non-string logger name "+
+Logger.prototype={trace:function(){this.log(Level.TRACE,arguments);},debug:function(){this.log(Level.DEBUG,arguments);},info:function(){this.log(Level.INFO,arguments);},warn:function(){this.log(Level.WARN,arguments);},error:function(){this.log(Level.ERROR,arguments);},fatal:function(){this.log(Level.FATAL,arguments);},isEnabledFor:function(level){return level.isGreaterOrEqual(this.getEffectiveLevel());},isTraceEnabled:function(){return this.isEnabledFor(Level.TRACE);},isDebugEnabled:function(){return this.isEnabledFor(Level.DEBUG);},isInfoEnabled:function(){return this.isEnabledFor(Level.INFO);},isWarnEnabled:function(){return this.isEnabledFor(Level.WARN);},isErrorEnabled:function(){return this.isEnabledFor(Level.ERROR);},isFatalEnabled:function(){return this.isEnabledFor(Level.FATAL);}};Logger.prototype.trace.isEntryPoint=true;Logger.prototype.debug.isEntryPoint=true;Logger.prototype.info.isEntryPoint=true;Logger.prototype.warn.isEntryPoint=true;Logger.prototype.error.isEntryPoint=true;Logger.prototype.fatal.isEntryPoint=true;var loggers={};var loggerNames=[];var ROOT_LOGGER_DEFAULT_LEVEL=Level.DEBUG;var rootLogger=new Logger(rootLoggerName);rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);log4javascript.getRootLogger=function(){return rootLogger;};log4javascript.getLogger=function(loggerName){if(typeof loggerName!="string"){loggerName=anonymousLoggerName;logLog.warn("log4javascript.getLogger: non-string logger name "+
toStr(loggerName)+" supplied, returning anonymous logger");}
if(loggerName==rootLoggerName){handleError("log4javascript.getLogger: root logger may not be obtained by name");}
if(!loggers[loggerName]){var logger=new Logger(loggerName);loggers[loggerName]=logger;loggerNames.push(loggerName);var lastDotIndex=loggerName.lastIndexOf(".");var parentLogger;if(lastDotIndex>-1){var parentLoggerName=loggerName.substring(0,lastDotIndex);parentLogger=log4javascript.getLogger(parentLoggerName);}else{parentLogger=rootLogger;}
parentLogger.addChild(logger);}
-return loggers[loggerName];};var defaultLogger=null;log4javascript.getDefaultLogger=function(){if(!defaultLogger){defaultLogger=log4javascript.getLogger(defaultLoggerName);var a=new log4javascript.PopUpAppender();defaultLogger.addAppender(a);}
+return loggers[loggerName];};var defaultLogger=null;log4javascript.getDefaultLogger=function(){if(!defaultLogger){defaultLogger=createDefaultLogger();}
return defaultLogger;};var nullLogger=null;log4javascript.getNullLogger=function(){if(!nullLogger){nullLogger=new Logger(nullLoggerName);nullLogger.setLevel(Level.OFF);}
return nullLogger;};log4javascript.resetConfiguration=function(){rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);loggers={};};var LoggingEvent=function(logger,timeStamp,level,messages,exception){this.logger=logger;this.timeStamp=timeStamp;this.timeStampInMilliseconds=timeStamp.getTime();this.timeStampInSeconds=Math.floor(this.timeStampInMilliseconds/1000);this.milliseconds=this.timeStamp.getMilliseconds();this.level=level;this.messages=messages;this.exception=exception;};LoggingEvent.prototype={getThrowableStrRep:function(){return this.exception?getExceptionStringRep(this.exception):"";},getCombinedMessages:function(){return(this.messages.length==1)?this.messages[0]:this.messages.join(newLine);},toString:function(){return"LoggingEvent["+this.level+"]";}};log4javascript.LoggingEvent=LoggingEvent;var Layout=function(){};Layout.prototype={defaults:{loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url"},loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url",batchHeader:"",batchFooter:"",batchSeparator:"",returnsPostData:false,overrideTimeStampsSetting:false,useTimeStampsInMilliseconds:null,format:function(){handleError("Layout.format: layout supplied has no format() method");},ignoresThrowable:function(){handleError("Layout.ignoresThrowable: layout supplied has no ignoresThrowable() method");},getContentType:function(){return"text/plain";},allowBatching:function(){return true;},setTimeStampsInMilliseconds:function(timeStampsInMilliseconds){this.overrideTimeStampsSetting=true;this.useTimeStampsInMilliseconds=bool(timeStampsInMilliseconds);},isTimeStampsInMilliseconds:function(){return this.overrideTimeStampsSetting?this.useTimeStampsInMilliseconds:useTimeStampsInMilliseconds;},getTimeStampValue:function(loggingEvent){return this.isTimeStampsInMilliseconds()?loggingEvent.timeStampInMilliseconds:loggingEvent.timeStampInSeconds;},getDataValues:function(loggingEvent,combineMessages){var dataValues=[[this.loggerKey,loggingEvent.logger.name],[this.timeStampKey,this.getTimeStampValue(loggingEvent)],[this.levelKey,loggingEvent.level.name],[this.urlKey,window.location.href],[this.messageKey,combineMessages?loggingEvent.getCombinedMessages():loggingEvent.messages]];if(!this.isTimeStampsInMilliseconds()){dataValues.push([this.millisecondsKey,loggingEvent.milliseconds]);}
if(loggingEvent.exception){dataValues.push([this.exceptionKey,getExceptionStringRep(loggingEvent.exception)]);}
@@ -110,7 +103,7 @@ for(i=0,len=dataValues.length-1;i<=len;i++){str+=this.tab+"\""+dataValues[i][0]+
str+=this.lineBreak;}
str+="}"+this.lineBreak;return str;};JsonLayout.prototype.ignoresThrowable=function(){return false;};JsonLayout.prototype.toString=function(){return"JsonLayout";};JsonLayout.prototype.getContentType=function(){return"application/json";};log4javascript.JsonLayout=JsonLayout;function HttpPostDataLayout(){this.setKeys();this.customFields=[];this.returnsPostData=true;}
HttpPostDataLayout.prototype=new Layout();HttpPostDataLayout.prototype.allowBatching=function(){return false;};HttpPostDataLayout.prototype.format=function(loggingEvent){var dataValues=this.getDataValues(loggingEvent);var queryBits=[];for(var i=0,len=dataValues.length;i=200&&xmlHttp.status<300)||xmlHttp.status==1223;}
function AjaxAppender(url,withCredentials){var appender=this;var isSupported=true;if(!url){handleError("AjaxAppender: URL must be specified in constructor");isSupported=false;}
var timed=this.defaults.timed;var waitForResponse=this.defaults.waitForResponse;var batchSize=this.defaults.batchSize;var timerInterval=this.defaults.timerInterval;var requestSuccessCallback=this.defaults.requestSuccessCallback;var failCallback=this.defaults.failCallback;var postVarName=this.defaults.postVarName;var sendAllOnUnload=this.defaults.sendAllOnUnload;var contentType=this.defaults.contentType;var sessionId=null;var queuedLoggingEvents=[];var queuedRequests=[];var headers=[];var sending=false;var initialized=false;function checkCanConfigure(configOptionName){if(initialized){handleError("AjaxAppender: configuration option '"+
@@ -173,18 +166,18 @@ postData+="layout="+urlEncode(appender.getLayout().toString());}
return postData;}
function scheduleSending(){window.setTimeout(sendAll,timerInterval);}
function xmlHttpErrorHandler(){var msg="AjaxAppender: could not create XMLHttpRequest object. AjaxAppender disabled";handleError(msg);isSupported=false;if(failCallback){failCallback(msg);}}
-function sendRequest(postData,successCallback){try{var xmlHttp=getXmlHttp(xmlHttpErrorHandler);if(isSupported){if(withCredentials&&withCredentialsSupported){xmlHttp.withCredentials=true;}
-xmlHttp.onreadystatechange=function(){if(xmlHttp.readyState==4){if(isHttpRequestSuccessful(xmlHttp)){if(requestSuccessCallback){requestSuccessCallback(xmlHttp);}
+function sendRequest(postData,successCallback){try{var xmlHttp=getXmlHttp(xmlHttpErrorHandler);if(isSupported){xmlHttp.onreadystatechange=function(){if(xmlHttp.readyState==4){if(isHttpRequestSuccessful(xmlHttp)){if(requestSuccessCallback){requestSuccessCallback(xmlHttp);}
if(successCallback){successCallback(xmlHttp);}}else{var msg="AjaxAppender.append: XMLHttpRequest request to URL "+
url+" returned status code "+xmlHttp.status;handleError(msg);if(failCallback){failCallback(msg);}}
-xmlHttp.onreadystatechange=emptyFunction;xmlHttp=null;}};xmlHttp.open("POST",url,true);try{for(var i=0,header;header=headers[i++];){xmlHttp.setRequestHeader(header.name,header.value);}
+xmlHttp.onreadystatechange=emptyFunction;xmlHttp=null;}};xmlHttp.open("POST",url,true);if(withCredentials&&withCredentialsSupported){xmlHttp.withCredentials=true;}
+try{for(var i=0,header;header=headers[i++];){xmlHttp.setRequestHeader(header.name,header.value);}
xmlHttp.setRequestHeader("Content-Type",contentType);}catch(headerEx){var msg="AjaxAppender.append: your browser's XMLHttpRequest implementation"+" does not support setRequestHeader, therefore cannot post data. AjaxAppender disabled";handleError(msg);isSupported=false;if(failCallback){failCallback(msg);}
return;}
xmlHttp.send(postData);}}catch(ex){var errMsg="AjaxAppender.append: error sending log message to "+url;handleError(errMsg,ex);isSupported=false;if(failCallback){failCallback(errMsg+". Details: "+getExceptionStringRep(ex));}}}
this.append=function(loggingEvent){if(isSupported){if(!initialized){init();}
queuedLoggingEvents.push(loggingEvent);var actualBatchSize=this.getLayout().allowBatching()?batchSize:1;if(queuedLoggingEvents.length>=actualBatchSize){var currentLoggingEvent;var batchedLoggingEvents=[];while((currentLoggingEvent=queuedLoggingEvents.shift())){batchedLoggingEvents.push(currentLoggingEvent);}
queuedRequests.push(batchedLoggingEvents);if(!timed&&(!waitForResponse||(waitForResponse&&!sending))){sendAll();}}}};function init(){initialized=true;if(sendAllOnUnload){var oldBeforeUnload=window.onbeforeunload;window.onbeforeunload=function(){if(oldBeforeUnload){oldBeforeUnload();}
-if(sendAllRemaining()){return"Sending log messages";}};}
+sendAllRemaining();};}
if(timed){scheduleSending();}}}
AjaxAppender.prototype=new Appender();AjaxAppender.prototype.defaults={waitForResponse:false,timed:false,timerInterval:1000,batchSize:1,sendAllOnUnload:false,requestSuccessCallback:null,failCallback:null,postVarName:"data",contentType:"application/x-www-form-urlencoded"};AjaxAppender.prototype.layout=new HttpPostDataLayout();AjaxAppender.prototype.toString=function(){return"AjaxAppender";};log4javascript.AjaxAppender=AjaxAppender;function setCookie(name,value,days,path){var expires;path=path?"; path="+path:"";if(days){var date=new Date();date.setTime(date.getTime()+(days*24*60*60*1000));expires="; expires="+date.toGMTString();}else{expires="";}
document.cookie=escape(name)+"="+escape(value)+expires+path;}
@@ -194,12 +187,12 @@ return null;}
function getBaseUrl(){var scripts=document.getElementsByTagName("script");for(var i=0,len=scripts.length;i','','','log4javascript','','','','','','','','','','','
','
','
','Filters:','','','','','','','','
','
',' ','','','','','
','','','','','
','
','
','Options:','','','','','','','','
','
','
','','
','
','','','
','
','','',''];};var defaultCommandLineFunctions=[];ConsoleAppender=function(){};var consoleAppenderIdCounter=1;ConsoleAppender.prototype=new Appender();ConsoleAppender.prototype.create=function(inPage,container,lazyInit,initiallyMinimized,useDocumentWrite,width,height,focusConsoleWindow){var appender=this;var initialized=false;var consoleWindowCreated=false;var consoleWindowLoaded=false;var consoleClosed=false;var queuedLoggingEvents=[];var isSupported=true;var consoleAppenderId=consoleAppenderIdCounter++;initiallyMinimized=extractBooleanFromParam(initiallyMinimized,this.defaults.initiallyMinimized);lazyInit=extractBooleanFromParam(lazyInit,this.defaults.lazyInit);useDocumentWrite=extractBooleanFromParam(useDocumentWrite,this.defaults.useDocumentWrite);var newestMessageAtTop=this.defaults.newestMessageAtTop;var scrollToLatestMessage=this.defaults.scrollToLatestMessage;width=width?width:this.defaults.width;height=height?height:this.defaults.height;var maxMessages=this.defaults.maxMessages;var showCommandLine=this.defaults.showCommandLine;var commandLineObjectExpansionDepth=this.defaults.commandLineObjectExpansionDepth;var showHideButton=this.defaults.showHideButton;var showCloseButton=this.defaults.showCloseButton;var showLogEntryDeleteButtons=this.defaults.showLogEntryDeleteButtons;this.setLayout(this.defaults.layout);var init,createWindow,safeToAppend,getConsoleWindow,open;var appenderName=inPage?"InPageAppender":"PopUpAppender";var checkCanConfigure=function(configOptionName){if(consoleWindowCreated){handleError(appenderName+": configuration option '"+configOptionName+"' may not be set after the appender has been initialized");return false;}
+var ConsoleAppender;(function(){var getConsoleHtmlLines=function(){return['','','','log4javascript','','','','','','','','','','','
','
','
','Filters:','','','','','','','','
','
',' ','','','','','
','','','','','
','
','
','Options:','','','','','','','','
','
','
','','
','
','','','
','
','','',''];};var defaultCommandLineFunctions=[];ConsoleAppender=function(){};var consoleAppenderIdCounter=1;ConsoleAppender.prototype=new Appender();ConsoleAppender.prototype.create=function(inPage,container,lazyInit,initiallyMinimized,useDocumentWrite,width,height,focusConsoleWindow){var appender=this;var initialized=false;var consoleWindowCreated=false;var consoleWindowLoaded=false;var consoleClosed=false;var queuedLoggingEvents=[];var isSupported=true;var consoleAppenderId=consoleAppenderIdCounter++;initiallyMinimized=extractBooleanFromParam(initiallyMinimized,this.defaults.initiallyMinimized);lazyInit=extractBooleanFromParam(lazyInit,this.defaults.lazyInit);useDocumentWrite=extractBooleanFromParam(useDocumentWrite,this.defaults.useDocumentWrite);var newestMessageAtTop=this.defaults.newestMessageAtTop;var scrollToLatestMessage=this.defaults.scrollToLatestMessage;width=width?width:this.defaults.width;height=height?height:this.defaults.height;var maxMessages=this.defaults.maxMessages;var showCommandLine=this.defaults.showCommandLine;var commandLineObjectExpansionDepth=this.defaults.commandLineObjectExpansionDepth;var showHideButton=this.defaults.showHideButton;var showCloseButton=this.defaults.showCloseButton;this.setLayout(this.defaults.layout);var init,createWindow,safeToAppend,getConsoleWindow,open;var appenderName=inPage?"InPageAppender":"PopUpAppender";var checkCanConfigure=function(configOptionName){if(consoleWindowCreated){handleError(appenderName+": configuration option '"+configOptionName+"' may not be set after the appender has been initialized");return false;}
return true;};var consoleWindowExists=function(){return(consoleWindowLoaded&&isSupported&&!consoleClosed);};this.isNewestMessageAtTop=function(){return newestMessageAtTop;};this.setNewestMessageAtTop=function(newestMessageAtTopParam){newestMessageAtTop=bool(newestMessageAtTopParam);if(consoleWindowExists()){getConsoleWindow().setNewestAtTop(newestMessageAtTop);}};this.isScrollToLatestMessage=function(){return scrollToLatestMessage;};this.setScrollToLatestMessage=function(scrollToLatestMessageParam){scrollToLatestMessage=bool(scrollToLatestMessageParam);if(consoleWindowExists()){getConsoleWindow().setScrollToLatest(scrollToLatestMessage);}};this.getWidth=function(){return width;};this.setWidth=function(widthParam){if(checkCanConfigure("width")){width=extractStringFromParam(widthParam,width);}};this.getHeight=function(){return height;};this.setHeight=function(heightParam){if(checkCanConfigure("height")){height=extractStringFromParam(heightParam,height);}};this.getMaxMessages=function(){return maxMessages;};this.setMaxMessages=function(maxMessagesParam){maxMessages=extractIntFromParam(maxMessagesParam,maxMessages);if(consoleWindowExists()){getConsoleWindow().setMaxMessages(maxMessages);}};this.isShowCommandLine=function(){return showCommandLine;};this.setShowCommandLine=function(showCommandLineParam){showCommandLine=bool(showCommandLineParam);if(consoleWindowExists()){getConsoleWindow().setShowCommandLine(showCommandLine);}};this.isShowHideButton=function(){return showHideButton;};this.setShowHideButton=function(showHideButtonParam){showHideButton=bool(showHideButtonParam);if(consoleWindowExists()){getConsoleWindow().setShowHideButton(showHideButton);}};this.isShowCloseButton=function(){return showCloseButton;};this.setShowCloseButton=function(showCloseButtonParam){showCloseButton=bool(showCloseButtonParam);if(consoleWindowExists()){getConsoleWindow().setShowCloseButton(showCloseButton);}};this.getCommandLineObjectExpansionDepth=function(){return commandLineObjectExpansionDepth;};this.setCommandLineObjectExpansionDepth=function(commandLineObjectExpansionDepthParam){commandLineObjectExpansionDepth=extractIntFromParam(commandLineObjectExpansionDepthParam,commandLineObjectExpansionDepth);};var minimized=initiallyMinimized;this.isInitiallyMinimized=function(){return initiallyMinimized;};this.setInitiallyMinimized=function(initiallyMinimizedParam){if(checkCanConfigure("initiallyMinimized")){initiallyMinimized=bool(initiallyMinimizedParam);minimized=initiallyMinimized;}};this.isUseDocumentWrite=function(){return useDocumentWrite;};this.setUseDocumentWrite=function(useDocumentWriteParam){if(checkCanConfigure("useDocumentWrite")){useDocumentWrite=bool(useDocumentWriteParam);}};function QueuedLoggingEvent(loggingEvent,formattedMessage){this.loggingEvent=loggingEvent;this.levelName=loggingEvent.level.name;this.formattedMessage=formattedMessage;}
QueuedLoggingEvent.prototype.append=function(){getConsoleWindow().log(this.levelName,this.formattedMessage);};function QueuedGroup(name,initiallyExpanded){this.name=name;this.initiallyExpanded=initiallyExpanded;}
QueuedGroup.prototype.append=function(){getConsoleWindow().group(this.name,this.initiallyExpanded);};function QueuedGroupEnd(){}
QueuedGroupEnd.prototype.append=function(){getConsoleWindow().groupEnd();};var checkAndAppend=function(){safeToAppend();if(!initialized){init();}else if(consoleClosed&&reopenWhenClosed){createWindow();}
-if(safeToAppend()){appendQueuedLoggingEvents();}};this.append=function(loggingEvent){if(isSupported){var formattedMessage=appender.getLayout().formatWithException(loggingEvent);queuedLoggingEvents.push(new QueuedLoggingEvent(loggingEvent,formattedMessage));checkAndAppend();}};this.group=function(name,initiallyExpanded){if(isSupported){queuedLoggingEvents.push(new QueuedGroup(name,initiallyExpanded));checkAndAppend();}};this.groupEnd=function(){if(isSupported){queuedLoggingEvents.push(new QueuedGroupEnd());checkAndAppend();}};var appendQueuedLoggingEvents=function(){var currentLoggingEvent;while(queuedLoggingEvents.length>0){queuedLoggingEvents.shift().append();}
+if(safeToAppend()){appendQueuedLoggingEvents();}};this.append=function(loggingEvent){if(isSupported){var formattedMessage=appender.getLayout().formatWithException(loggingEvent);queuedLoggingEvents.push(new QueuedLoggingEvent(loggingEvent,formattedMessage));checkAndAppend();}};this.group=function(name,initiallyExpanded){if(isSupported){queuedLoggingEvents.push(new QueuedGroup(name,initiallyExpanded));checkAndAppend();}};this.groupEnd=function(){if(isSupported){queuedLoggingEvents.push(new QueuedGroupEnd());checkAndAppend();}};var appendQueuedLoggingEvents=function(){while(queuedLoggingEvents.length>0){queuedLoggingEvents.shift().append();}
if(focusConsoleWindow){getConsoleWindow().focus();}};this.setAddedToLogger=function(logger){this.loggers.push(logger);if(enabled&&!lazyInit){init();}};this.clear=function(){if(consoleWindowExists()){getConsoleWindow().clearLog();}
queuedLoggingEvents.length=0;};this.focus=function(){if(consoleWindowExists()){getConsoleWindow().focus();}};this.focusCommandLine=function(){if(consoleWindowExists()){getConsoleWindow().focusCommandLine();}};this.focusSearch=function(){if(consoleWindowExists()){getConsoleWindow().focusSearch();}};var commandWindow=window;this.getCommandWindow=function(){return commandWindow;};this.setCommandWindow=function(commandWindowParam){commandWindow=commandWindowParam;};this.executeLastCommand=function(){if(consoleWindowExists()){getConsoleWindow().evalLastCommand();}};var commandLayout=new PatternLayout("%m");this.getCommandLayout=function(){return commandLayout;};this.setCommandLayout=function(commandLayoutParam){commandLayout=commandLayoutParam;};this.evalCommandAndAppend=function(expr){var commandReturnValue={appendResult:true,isError:false};var commandOutput="";try{var result,i;if(!commandWindow.eval&&commandWindow.execScript){commandWindow.execScript("null");}
var commandLineFunctionsHash={};for(i=0,len=commandLineFunctions.length;i]*>","i");if(regex.test(el.outerHTML)){return RegExp.$1.toLowerCase();}}
return"";}
-var lt="<";var gt=">";if(includeRootNode&&rootNode.nodeType!=nodeTypes.DOCUMENT_FRAGMENT_NODE){switch(rootNode.nodeType){case nodeTypes.ELEMENT_NODE:var tagName=rootNode.tagName.toLowerCase();xhtml=startNewLine?newLine+indentation:"";xhtml+=lt;var prefix=getNamespace(rootNode);var hasPrefix=!!prefix;if(hasPrefix){xhtml+=prefix+":";}
+var lt="<";var gt=">";var i,len;if(includeRootNode&&rootNode.nodeType!=nodeTypes.DOCUMENT_FRAGMENT_NODE){switch(rootNode.nodeType){case nodeTypes.ELEMENT_NODE:var tagName=rootNode.tagName.toLowerCase();xhtml=startNewLine?newLine+indentation:"";xhtml+=lt;var prefix=getNamespace(rootNode);var hasPrefix=!!prefix;if(hasPrefix){xhtml+=prefix+":";}
xhtml+=tagName;for(i=0,len=rootNode.attributes.length;i"+newLine;case nodeTypes.DOCUMENT_NODE:xhtml="";for(var i=0,len=rootNode.childNodes.length;i"+newLine;case nodeTypes.DOCUMENT_NODE:xhtml="";for(i=0,len=rootNode.childNodes.length;i0){var firstItem=this[0];for(var i=0,len=this.length-1;i0){var firstItem=this[0];for(var i=0,len=this.length-1;i2)?itemsAfterDeleted=argumentsArray.slice(2).concat(itemsAfterDeleted):itemsAfterDeleted;for(i=0,len=itemsToAppend.length;i=0){arr.splice(index,1);return true;}else{return false;}}
function array_contains(arr,val){for(var i=0,len=arr.length;i=level.level;}};Level.ALL=new Level(Number.MIN_VALUE,"ALL");Level.TRACE=new Level(10000,"TRACE");Level.DEBUG=new Level(20000,"DEBUG");Level.INFO=new Level(30000,"INFO");Level.WARN=new Level(40000,"WARN");Level.ERROR=new Level(50000,"ERROR");Level.FATAL=new Level(60000,"FATAL");Level.OFF=new Level(Number.MAX_VALUE,"OFF");log4javascript.Level=Level;function Timer(name,level){this.name=name;this.level=isUndefined(level)?Level.INFO:level;this.start=new Date();}
@@ -72,12 +65,12 @@ var loggingEvent=new LoggingEvent(this,new Date(),level,messages,exception);this
this.name+" is not an instance of log4javascript.Level");}};this.getLevel=function(){return loggerLevel;};this.getEffectiveLevel=function(){for(var logger=this;logger!==null;logger=logger.parent){var level=logger.getLevel();if(level!==null){return level;}}};this.group=function(name,initiallyExpanded){if(enabled){var effectiveAppenders=this.getEffectiveAppenders();for(var i=0,len=effectiveAppenders.length;i0)?args:["Assertion Failure"];args.push(newLine);args.push(expr);this.log(Level.ERROR,args);}};this.toString=function(){return"Logger["+this.name+"]";};}
-Logger.prototype={trace:function(){this.log(Level.TRACE,arguments);},debug:function(){this.log(Level.DEBUG,arguments);},info:function(){this.log(Level.INFO,arguments);},warn:function(){this.log(Level.WARN,arguments);},error:function(){this.log(Level.ERROR,arguments);},fatal:function(){this.log(Level.FATAL,arguments);},isEnabledFor:function(level){return level.isGreaterOrEqual(this.getEffectiveLevel());},isTraceEnabled:function(){return this.isEnabledFor(Level.TRACE);},isDebugEnabled:function(){return this.isEnabledFor(Level.DEBUG);},isInfoEnabled:function(){return this.isEnabledFor(Level.INFO);},isWarnEnabled:function(){return this.isEnabledFor(Level.WARN);},isErrorEnabled:function(){return this.isEnabledFor(Level.ERROR);},isFatalEnabled:function(){return this.isEnabledFor(Level.FATAL);}};Logger.prototype.trace.isEntryPoint=true;Logger.prototype.debug.isEntryPoint=true;Logger.prototype.info.isEntryPoint=true;Logger.prototype.warn.isEntryPoint=true;Logger.prototype.error.isEntryPoint=true;Logger.prototype.fatal.isEntryPoint=true;var loggers={};var loggerNames=[];var ROOT_LOGGER_DEFAULT_LEVEL=Level.DEBUG;var rootLogger=new Logger(rootLoggerName);rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);log4javascript.getRootLogger=function(){return rootLogger;};log4javascript.getLogger=function(loggerName){if(!(typeof loggerName=="string")){loggerName=anonymousLoggerName;logLog.warn("log4javascript.getLogger: non-string logger name "+
+Logger.prototype={trace:function(){this.log(Level.TRACE,arguments);},debug:function(){this.log(Level.DEBUG,arguments);},info:function(){this.log(Level.INFO,arguments);},warn:function(){this.log(Level.WARN,arguments);},error:function(){this.log(Level.ERROR,arguments);},fatal:function(){this.log(Level.FATAL,arguments);},isEnabledFor:function(level){return level.isGreaterOrEqual(this.getEffectiveLevel());},isTraceEnabled:function(){return this.isEnabledFor(Level.TRACE);},isDebugEnabled:function(){return this.isEnabledFor(Level.DEBUG);},isInfoEnabled:function(){return this.isEnabledFor(Level.INFO);},isWarnEnabled:function(){return this.isEnabledFor(Level.WARN);},isErrorEnabled:function(){return this.isEnabledFor(Level.ERROR);},isFatalEnabled:function(){return this.isEnabledFor(Level.FATAL);}};Logger.prototype.trace.isEntryPoint=true;Logger.prototype.debug.isEntryPoint=true;Logger.prototype.info.isEntryPoint=true;Logger.prototype.warn.isEntryPoint=true;Logger.prototype.error.isEntryPoint=true;Logger.prototype.fatal.isEntryPoint=true;var loggers={};var loggerNames=[];var ROOT_LOGGER_DEFAULT_LEVEL=Level.DEBUG;var rootLogger=new Logger(rootLoggerName);rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);log4javascript.getRootLogger=function(){return rootLogger;};log4javascript.getLogger=function(loggerName){if(typeof loggerName!="string"){loggerName=anonymousLoggerName;logLog.warn("log4javascript.getLogger: non-string logger name "+
toStr(loggerName)+" supplied, returning anonymous logger");}
if(loggerName==rootLoggerName){handleError("log4javascript.getLogger: root logger may not be obtained by name");}
if(!loggers[loggerName]){var logger=new Logger(loggerName);loggers[loggerName]=logger;loggerNames.push(loggerName);var lastDotIndex=loggerName.lastIndexOf(".");var parentLogger;if(lastDotIndex>-1){var parentLoggerName=loggerName.substring(0,lastDotIndex);parentLogger=log4javascript.getLogger(parentLoggerName);}else{parentLogger=rootLogger;}
parentLogger.addChild(logger);}
-return loggers[loggerName];};var defaultLogger=null;log4javascript.getDefaultLogger=function(){if(!defaultLogger){defaultLogger=log4javascript.getLogger(defaultLoggerName);var a=new log4javascript.PopUpAppender();defaultLogger.addAppender(a);}
+return loggers[loggerName];};var defaultLogger=null;log4javascript.getDefaultLogger=function(){if(!defaultLogger){defaultLogger=createDefaultLogger();}
return defaultLogger;};var nullLogger=null;log4javascript.getNullLogger=function(){if(!nullLogger){nullLogger=new Logger(nullLoggerName);nullLogger.setLevel(Level.OFF);}
return nullLogger;};log4javascript.resetConfiguration=function(){rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);loggers={};};var LoggingEvent=function(logger,timeStamp,level,messages,exception){this.logger=logger;this.timeStamp=timeStamp;this.timeStampInMilliseconds=timeStamp.getTime();this.timeStampInSeconds=Math.floor(this.timeStampInMilliseconds/1000);this.milliseconds=this.timeStamp.getMilliseconds();this.level=level;this.messages=messages;this.exception=exception;};LoggingEvent.prototype={getThrowableStrRep:function(){return this.exception?getExceptionStringRep(this.exception):"";},getCombinedMessages:function(){return(this.messages.length==1)?this.messages[0]:this.messages.join(newLine);},toString:function(){return"LoggingEvent["+this.level+"]";}};log4javascript.LoggingEvent=LoggingEvent;var Layout=function(){};Layout.prototype={defaults:{loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url"},loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url",batchHeader:"",batchFooter:"",batchSeparator:"",returnsPostData:false,overrideTimeStampsSetting:false,useTimeStampsInMilliseconds:null,format:function(){handleError("Layout.format: layout supplied has no format() method");},ignoresThrowable:function(){handleError("Layout.ignoresThrowable: layout supplied has no ignoresThrowable() method");},getContentType:function(){return"text/plain";},allowBatching:function(){return true;},setTimeStampsInMilliseconds:function(timeStampsInMilliseconds){this.overrideTimeStampsSetting=true;this.useTimeStampsInMilliseconds=bool(timeStampsInMilliseconds);},isTimeStampsInMilliseconds:function(){return this.overrideTimeStampsSetting?this.useTimeStampsInMilliseconds:useTimeStampsInMilliseconds;},getTimeStampValue:function(loggingEvent){return this.isTimeStampsInMilliseconds()?loggingEvent.timeStampInMilliseconds:loggingEvent.timeStampInSeconds;},getDataValues:function(loggingEvent,combineMessages){var dataValues=[[this.loggerKey,loggingEvent.logger.name],[this.timeStampKey,this.getTimeStampValue(loggingEvent)],[this.levelKey,loggingEvent.level.name],[this.urlKey,window.location.href],[this.messageKey,combineMessages?loggingEvent.getCombinedMessages():loggingEvent.messages]];if(!this.isTimeStampsInMilliseconds()){dataValues.push([this.millisecondsKey,loggingEvent.milliseconds]);}
if(loggingEvent.exception){dataValues.push([this.exceptionKey,getExceptionStringRep(loggingEvent.exception)]);}
@@ -110,7 +103,7 @@ for(i=0,len=dataValues.length-1;i<=len;i++){str+=this.tab+"\""+dataValues[i][0]+
str+=this.lineBreak;}
str+="}"+this.lineBreak;return str;};JsonLayout.prototype.ignoresThrowable=function(){return false;};JsonLayout.prototype.toString=function(){return"JsonLayout";};JsonLayout.prototype.getContentType=function(){return"application/json";};log4javascript.JsonLayout=JsonLayout;function HttpPostDataLayout(){this.setKeys();this.customFields=[];this.returnsPostData=true;}
HttpPostDataLayout.prototype=new Layout();HttpPostDataLayout.prototype.allowBatching=function(){return false;};HttpPostDataLayout.prototype.format=function(loggingEvent){var dataValues=this.getDataValues(loggingEvent);var queryBits=[];for(var i=0,len=dataValues.length;i=actualBatchSize){var currentLoggingEvent;var batchedLoggingEvents=[];while((currentLoggingEvent=queuedLoggingEvents.shift())){batchedLoggingEvents.push(currentLoggingEvent);}
queuedRequests.push(batchedLoggingEvents);if(!timed&&(!waitForResponse||(waitForResponse&&!sending))){sendAll();}}}};function init(){initialized=true;if(sendAllOnUnload){var oldBeforeUnload=window.onbeforeunload;window.onbeforeunload=function(){if(oldBeforeUnload){oldBeforeUnload();}
-if(sendAllRemaining()){return"Sending log messages";}};}
+sendAllRemaining();};}
if(timed){scheduleSending();}}}
-AjaxAppender.prototype=new Appender();AjaxAppender.prototype.defaults={waitForResponse:false,timed:false,timerInterval:1000,batchSize:1,sendAllOnUnload:false,requestSuccessCallback:null,failCallback:null,postVarName:"data",contentType:"application/x-www-form-urlencoded"};AjaxAppender.prototype.layout=new HttpPostDataLayout();AjaxAppender.prototype.toString=function(){return"AjaxAppender";};log4javascript.AjaxAppender=AjaxAppender;log4javascript.setDocumentReady=function(){pageLoaded=true;log4javascript.dispatchEvent("load",{});};if(window.addEventListener){window.addEventListener("load",log4javascript.setDocumentReady,false);}else if(window.attachEvent){window.attachEvent("onload",log4javascript.setDocumentReady);}else{var oldOnload=window.onload;if(typeof window.onload!="function"){window.onload=log4javascript.setDocumentReady;}else{window.onload=function(evt){if(oldOnload){oldOnload(evt);}
+AjaxAppender.prototype=new Appender();AjaxAppender.prototype.defaults={waitForResponse:false,timed:false,timerInterval:1000,batchSize:1,sendAllOnUnload:false,requestSuccessCallback:null,failCallback:null,postVarName:"data",contentType:"application/x-www-form-urlencoded"};AjaxAppender.prototype.layout=new HttpPostDataLayout();AjaxAppender.prototype.toString=function(){return"AjaxAppender";};log4javascript.AjaxAppender=AjaxAppender;function createDefaultLogger(){return log4javascript.getLogger(defaultLoggerName);}
+log4javascript.setDocumentReady=function(){pageLoaded=true;log4javascript.dispatchEvent("load",{});};if(window.addEventListener){window.addEventListener("load",log4javascript.setDocumentReady,false);}else if(window.attachEvent){window.attachEvent("onload",log4javascript.setDocumentReady);}else{var oldOnload=window.onload;if(typeof window.onload!="function"){window.onload=log4javascript.setDocumentReady;}else{window.onload=function(evt){if(oldOnload){oldOnload(evt);}
log4javascript.setDocumentReady();};}}
-window.log4javascript=log4javascript;return log4javascript;})();
+return log4javascript;},this);
diff --git a/js/log4javascript_production_uncompressed.js b/js/log4javascript_production_uncompressed.js
index cdd9d98..08e36c2 100644
--- a/js/log4javascript_production_uncompressed.js
+++ b/js/log4javascript_production_uncompressed.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,60 +24,67 @@
* stored in the same directory as the main log4javascript.js file.
*
* Author: Tim Down
- * Version: 1.4.9
+ * Version: 1.4.13
* Edition: log4javascript_production
- * Build date: 12 May 2014
+ * Build date: 23 May 2015
* Website: http://log4javascript.org
*/
-/* -------------------------------------------------------------------------- */
-// Array-related stuff
-
-// Next three methods are solely for IE5, which is missing them
-if (!Array.prototype.push) {
- Array.prototype.push = function() {
- for (var i = 0, len = arguments.length; i < len; i++){
- this[this.length] = arguments[i];
- }
- return this.length;
- };
-}
+(function(factory, root) {
+ if (typeof define == "function" && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(factory);
+ } else if (typeof module != "undefined" && typeof exports == "object") {
+ // Node/CommonJS style
+ module.exports = factory();
+ } else {
+ // No AMD or CommonJS support so we place log4javascript in (probably) the global variable
+ root.log4javascript = factory();
+ }
+})(function() {
+ // Array-related stuff. Next three methods are solely for IE5, which is missing them
+ if (!Array.prototype.push) {
+ Array.prototype.push = function() {
+ for (var i = 0, len = arguments.length; i < len; i++){
+ this[this.length] = arguments[i];
+ }
+ return this.length;
+ };
+ }
-if (!Array.prototype.shift) {
- Array.prototype.shift = function() {
- if (this.length > 0) {
- var firstItem = this[0];
- for (var i = 0, len = this.length - 1; i < len; i++) {
- this[i] = this[i + 1];
+ if (!Array.prototype.shift) {
+ Array.prototype.shift = function() {
+ if (this.length > 0) {
+ var firstItem = this[0];
+ for (var i = 0, len = this.length - 1; i < len; i++) {
+ this[i] = this[i + 1];
+ }
+ this.length = this.length - 1;
+ return firstItem;
}
- this.length = this.length - 1;
- return firstItem;
- }
- };
-}
-
-if (!Array.prototype.splice) {
- Array.prototype.splice = function(startIndex, deleteCount) {
- var itemsAfterDeleted = this.slice(startIndex + deleteCount);
- var itemsDeleted = this.slice(startIndex, startIndex + deleteCount);
- this.length = startIndex;
- // Copy the arguments into a proper Array object
- var argumentsArray = [];
- for (var i = 0, len = arguments.length; i < len; i++) {
- argumentsArray[i] = arguments[i];
- }
- var itemsToAppend = (argumentsArray.length > 2) ?
- itemsAfterDeleted = argumentsArray.slice(2).concat(itemsAfterDeleted) : itemsAfterDeleted;
- for (i = 0, len = itemsToAppend.length; i < len; i++) {
- this.push(itemsToAppend[i]);
- }
- return itemsDeleted;
- };
-}
+ };
+ }
-/* -------------------------------------------------------------------------- */
+ if (!Array.prototype.splice) {
+ Array.prototype.splice = function(startIndex, deleteCount) {
+ var itemsAfterDeleted = this.slice(startIndex + deleteCount);
+ var itemsDeleted = this.slice(startIndex, startIndex + deleteCount);
+ this.length = startIndex;
+ // Copy the arguments into a proper Array object
+ var argumentsArray = [];
+ for (var i = 0, len = arguments.length; i < len; i++) {
+ argumentsArray[i] = arguments[i];
+ }
+ var itemsToAppend = (argumentsArray.length > 2) ?
+ itemsAfterDeleted = argumentsArray.slice(2).concat(itemsAfterDeleted) : itemsAfterDeleted;
+ for (i = 0, len = itemsToAppend.length; i < len; i++) {
+ this.push(itemsToAppend[i]);
+ }
+ return itemsDeleted;
+ };
+ }
-var log4javascript = (function() {
+ /* ---------------------------------------------------------------------- */
function isUndefined(obj) {
return typeof obj == "undefined";
@@ -150,8 +157,8 @@ var log4javascript = (function() {
function Log4JavaScript() {}
Log4JavaScript.prototype = new EventSupport();
- log4javascript = new Log4JavaScript();
- log4javascript.version = "1.4.9";
+ var log4javascript = new Log4JavaScript();
+ log4javascript.version = "1.4.13";
log4javascript.edition = "log4javascript_production";
/* -------------------------------------------------------------------------- */
@@ -220,19 +227,11 @@ var log4javascript = (function() {
var urlEncode = (typeof window.encodeURIComponent != "undefined") ?
function(str) {
return encodeURIComponent(str);
- }:
+ }:
function(str) {
return escape(str).replace(/\+/g, "%2B").replace(/"/g, "%22").replace(/'/g, "%27").replace(/\//g, "%2F").replace(/=/g, "%3D");
};
- var urlDecode = (typeof window.decodeURIComponent != "undefined") ?
- function(str) {
- return decodeURIComponent(str);
- }:
- function(str) {
- return unescape(str).replace(/%2B/g, "+").replace(/%22/g, "\"").replace(/%27/g, "'").replace(/%2F/g, "/").replace(/%3D/g, "=");
- };
-
function array_remove(arr, val) {
var index = -1;
for (var i = 0, len = arr.length; i < len; i++) {
@@ -329,66 +328,6 @@ var log4javascript = (function() {
};
}
- function getListenersPropertyName(eventName) {
- return "__log4javascript_listeners__" + eventName;
- }
-
- function addEvent(node, eventName, listener, useCapture, win) {
- win = win ? win : window;
- if (node.addEventListener) {
- node.addEventListener(eventName, listener, useCapture);
- } else if (node.attachEvent) {
- node.attachEvent("on" + eventName, listener);
- } else {
- var propertyName = getListenersPropertyName(eventName);
- if (!node[propertyName]) {
- node[propertyName] = [];
- // Set event handler
- node["on" + eventName] = function(evt) {
- evt = getEvent(evt, win);
- var listenersPropertyName = getListenersPropertyName(eventName);
-
- // Clone the array of listeners to leave the original untouched
- var listeners = this[listenersPropertyName].concat([]);
- var currentListener;
-
- // Call each listener in turn
- while ((currentListener = listeners.shift())) {
- currentListener.call(this, evt);
- }
- };
- }
- node[propertyName].push(listener);
- }
- }
-
- function removeEvent(node, eventName, listener, useCapture) {
- if (node.removeEventListener) {
- node.removeEventListener(eventName, listener, useCapture);
- } else if (node.detachEvent) {
- node.detachEvent("on" + eventName, listener);
- } else {
- var propertyName = getListenersPropertyName(eventName);
- if (node[propertyName]) {
- array_remove(node[propertyName], listener);
- }
- }
- }
-
- function getEvent(evt, win) {
- win = win ? win : window;
- return evt ? evt : win.event;
- }
-
- function stopEventPropagation(evt) {
- if (evt.stopPropagation) {
- evt.stopPropagation();
- } else if (typeof evt.cancelBubble != "undefined") {
- evt.cancelBubble = true;
- }
- evt.returnValue = false;
- }
-
/* ---------------------------------------------------------------------- */
// Simple logging for log4javascript itself
@@ -465,7 +404,6 @@ var log4javascript = (function() {
log4javascript.isTimeStampsInMilliseconds = function() {
return useTimeStampsInMilliseconds;
};
-
// This evaluates the given expression in the current scope, thus allowing
// scripts to access private variables. Particularly useful for testing
@@ -543,7 +481,7 @@ var log4javascript = (function() {
var appenderCache = null;
var appenderCacheInvalidated = false;
-
+
this.addChild = function(childLogger) {
this.children.push(childLogger);
childLogger.parent = this;
@@ -609,7 +547,7 @@ var log4javascript = (function() {
}
return appenderCache;
};
-
+
this.invalidateAppenderCache = function() {
appenderCacheInvalidated = true;
for (var i = 0, len = this.children.length; i < len; i++) {
@@ -817,7 +755,7 @@ var log4javascript = (function() {
log4javascript.getLogger = function(loggerName) {
// Use default logger if loggerName is not specified or invalid
- if (!(typeof loggerName == "string")) {
+ if (typeof loggerName != "string") {
loggerName = anonymousLoggerName;
logLog.warn("log4javascript.getLogger: non-string logger name " +
toStr(loggerName) + " supplied, returning anonymous logger");
@@ -851,9 +789,7 @@ var log4javascript = (function() {
var defaultLogger = null;
log4javascript.getDefaultLogger = function() {
if (!defaultLogger) {
- defaultLogger = log4javascript.getLogger(defaultLoggerName);
- var a = new log4javascript.PopUpAppender();
- defaultLogger.addAppender(a);
+ defaultLogger = createDefaultLogger();
}
return defaultLogger;
};
@@ -1102,7 +1038,7 @@ var log4javascript = (function() {
log4javascript.Appender = Appender;
/* ---------------------------------------------------------------------- */
- // SimpleLayout
+ // SimpleLayout
function SimpleLayout() {
this.customFields = [];
@@ -1115,16 +1051,16 @@ var log4javascript = (function() {
};
SimpleLayout.prototype.ignoresThrowable = function() {
- return true;
+ return true;
};
SimpleLayout.prototype.toString = function() {
- return "SimpleLayout";
+ return "SimpleLayout";
};
log4javascript.SimpleLayout = SimpleLayout;
/* ----------------------------------------------------------------------- */
- // NullLayout
+ // NullLayout
function NullLayout() {
this.customFields = [];
@@ -1137,7 +1073,7 @@ var log4javascript = (function() {
};
NullLayout.prototype.ignoresThrowable = function() {
- return true;
+ return true;
};
NullLayout.prototype.formatWithException = function(loggingEvent) {
@@ -1146,7 +1082,7 @@ var log4javascript = (function() {
};
NullLayout.prototype.toString = function() {
- return "NullLayout";
+ return "NullLayout";
};
log4javascript.NullLayout = NullLayout;
@@ -1214,11 +1150,11 @@ var log4javascript = (function() {
};
XmlLayout.prototype.ignoresThrowable = function() {
- return false;
+ return false;
};
XmlLayout.prototype.toString = function() {
- return "XmlLayout";
+ return "XmlLayout";
};
log4javascript.XmlLayout = XmlLayout;
@@ -1255,56 +1191,56 @@ var log4javascript = (function() {
return this.combineMessages;
};
- JsonLayout.prototype.format = function(loggingEvent) {
- var layout = this;
- var dataValues = this.getDataValues(loggingEvent, this.combineMessages);
- var str = "{" + this.lineBreak;
- var i, len;
-
- function formatValue(val, prefix, expand) {
- // Check the type of the data value to decide whether quotation marks
- // or expansion are required
- var formattedValue;
- var valType = typeof val;
- if (val instanceof Date) {
- formattedValue = String(val.getTime());
- } else if (expand && (val instanceof Array)) {
- formattedValue = "[" + layout.lineBreak;
- for (var i = 0, len = val.length; i < len; i++) {
- var childPrefix = prefix + layout.tab;
- formattedValue += childPrefix + formatValue(val[i], childPrefix, false);
- if (i < val.length - 1) {
- formattedValue += ",";
- }
- formattedValue += layout.lineBreak;
- }
- formattedValue += prefix + "]";
- } else if (valType !== "number" && valType !== "boolean") {
- formattedValue = "\"" + escapeNewLines(toStr(val).replace(/\"/g, "\\\"")) + "\"";
- } else {
- formattedValue = val;
- }
- return formattedValue;
- }
-
- for (i = 0, len = dataValues.length - 1; i <= len; i++) {
- str += this.tab + "\"" + dataValues[i][0] + "\"" + this.colon + formatValue(dataValues[i][1], this.tab, true);
- if (i < len) {
- str += ",";
- }
- str += this.lineBreak;
- }
-
- str += "}" + this.lineBreak;
- return str;
- };
+ JsonLayout.prototype.format = function(loggingEvent) {
+ var layout = this;
+ var dataValues = this.getDataValues(loggingEvent, this.combineMessages);
+ var str = "{" + this.lineBreak;
+ var i, len;
+
+ function formatValue(val, prefix, expand) {
+ // Check the type of the data value to decide whether quotation marks
+ // or expansion are required
+ var formattedValue;
+ var valType = typeof val;
+ if (val instanceof Date) {
+ formattedValue = String(val.getTime());
+ } else if (expand && (val instanceof Array)) {
+ formattedValue = "[" + layout.lineBreak;
+ for (var i = 0, len = val.length; i < len; i++) {
+ var childPrefix = prefix + layout.tab;
+ formattedValue += childPrefix + formatValue(val[i], childPrefix, false);
+ if (i < val.length - 1) {
+ formattedValue += ",";
+ }
+ formattedValue += layout.lineBreak;
+ }
+ formattedValue += prefix + "]";
+ } else if (valType !== "number" && valType !== "boolean") {
+ formattedValue = "\"" + escapeNewLines(toStr(val).replace(/\"/g, "\\\"")) + "\"";
+ } else {
+ formattedValue = val;
+ }
+ return formattedValue;
+ }
+
+ for (i = 0, len = dataValues.length - 1; i <= len; i++) {
+ str += this.tab + "\"" + dataValues[i][0] + "\"" + this.colon + formatValue(dataValues[i][1], this.tab, true);
+ if (i < len) {
+ str += ",";
+ }
+ str += this.lineBreak;
+ }
+
+ str += "}" + this.lineBreak;
+ return str;
+ };
JsonLayout.prototype.ignoresThrowable = function() {
- return false;
+ return false;
};
JsonLayout.prototype.toString = function() {
- return "JsonLayout";
+ return "JsonLayout";
};
JsonLayout.prototype.getContentType = function() {
@@ -1340,11 +1276,11 @@ var log4javascript = (function() {
};
HttpPostDataLayout.prototype.ignoresThrowable = function(loggingEvent) {
- return false;
+ return false;
};
HttpPostDataLayout.prototype.toString = function() {
- return "HttpPostDataLayout";
+ return "HttpPostDataLayout";
};
log4javascript.HttpPostDataLayout = HttpPostDataLayout;
@@ -1355,7 +1291,7 @@ var log4javascript = (function() {
var objectsExpanded = [];
function doFormat(obj, depth, indentation) {
- var i, j, len, childDepth, childIndentation, childLines, expansion,
+ var i, len, childDepth, childIndentation, childLines, expansion,
childExpansion;
if (!indentation) {
@@ -1400,8 +1336,8 @@ var log4javascript = (function() {
}
expansion += childLines.join("," + newLine) + newLine + indentation + "]";
return expansion;
- } else if (Object.prototype.toString.call(obj) == "[object Date]") {
- return obj.toString();
+ } else if (Object.prototype.toString.call(obj) == "[object Date]") {
+ return obj.toString();
} else if (typeof obj == "object" && depth > 0) {
objectsExpanded.push(obj);
expansion = "{" + newLine;
@@ -1816,11 +1752,11 @@ var log4javascript = (function() {
fieldIndex = fieldIndex - 1;
}
}
- var val = this.customFields[fieldIndex].value;
- if (typeof val == "function") {
- val = val(this, loggingEvent);
- }
- replacement = val;
+ var val = this.customFields[fieldIndex].value;
+ if (typeof val == "function") {
+ val = val(this, loggingEvent);
+ }
+ replacement = val;
}
break;
case "n": // New line
@@ -1875,11 +1811,11 @@ var log4javascript = (function() {
};
PatternLayout.prototype.ignoresThrowable = function() {
- return true;
+ return true;
};
PatternLayout.prototype.toString = function() {
- return "PatternLayout";
+ return "PatternLayout";
};
log4javascript.PatternLayout = PatternLayout;
@@ -2146,10 +2082,6 @@ var log4javascript = (function() {
try {
var xmlHttp = getXmlHttp(xmlHttpErrorHandler);
if (isSupported) {
- // Add withCredentials to facilitate CORS requests with cookies
- if (withCredentials && withCredentialsSupported) {
- xmlHttp.withCredentials = true;
- }
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4) {
if (isHttpRequestSuccessful(xmlHttp)) {
@@ -2172,6 +2104,10 @@ var log4javascript = (function() {
}
};
xmlHttp.open("POST", url, true);
+ // Add withCredentials to facilitate CORS requests with cookies
+ if (withCredentials && withCredentialsSupported) {
+ xmlHttp.withCredentials = true;
+ }
try {
for (var i = 0, header; header = headers[i++]; ) {
xmlHttp.setRequestHeader(header.name, header.value);
@@ -2234,9 +2170,7 @@ var log4javascript = (function() {
if (oldBeforeUnload) {
oldBeforeUnload();
}
- if (sendAllRemaining()) {
- return "Sending log messages";
- }
+ sendAllRemaining();
};
}
// Start timer
@@ -2268,36 +2202,37 @@ var log4javascript = (function() {
log4javascript.AjaxAppender = AjaxAppender;
+ /* ---------------------------------------------------------------------- */
+
+ function createDefaultLogger() {
+ return log4javascript.getLogger(defaultLoggerName);
+ }
+
/* ---------------------------------------------------------------------- */
// Main load
- log4javascript.setDocumentReady = function() {
- pageLoaded = true;
- log4javascript.dispatchEvent("load", {});
- };
-
- if (window.addEventListener) {
- window.addEventListener("load", log4javascript.setDocumentReady, false);
- } else if (window.attachEvent) {
- window.attachEvent("onload", log4javascript.setDocumentReady);
- } else {
- var oldOnload = window.onload;
- if (typeof window.onload != "function") {
- window.onload = log4javascript.setDocumentReady;
- } else {
- window.onload = function(evt) {
- if (oldOnload) {
- oldOnload(evt);
- }
- log4javascript.setDocumentReady();
- };
- }
- }
-
- // Ensure that the log4javascript object is available in the window. This
- // is necessary for log4javascript to be available in IE if loaded using
- // Dojo's module system
- window.log4javascript = log4javascript;
-
- return log4javascript;
-})();
\ No newline at end of file
+ log4javascript.setDocumentReady = function() {
+ pageLoaded = true;
+ log4javascript.dispatchEvent("load", {});
+ };
+
+ if (window.addEventListener) {
+ window.addEventListener("load", log4javascript.setDocumentReady, false);
+ } else if (window.attachEvent) {
+ window.attachEvent("onload", log4javascript.setDocumentReady);
+ } else {
+ var oldOnload = window.onload;
+ if (typeof window.onload != "function") {
+ window.onload = log4javascript.setDocumentReady;
+ } else {
+ window.onload = function(evt) {
+ if (oldOnload) {
+ oldOnload(evt);
+ }
+ log4javascript.setDocumentReady();
+ };
+ }
+ }
+
+ return log4javascript;
+}, this);
\ No newline at end of file
diff --git a/js/log4javascript_uncompressed.js b/js/log4javascript_uncompressed.js
index e0edaa5..48d3410 100644
--- a/js/log4javascript_uncompressed.js
+++ b/js/log4javascript_uncompressed.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,60 +24,67 @@
* stored in the same directory as the main log4javascript.js file.
*
* Author: Tim Down
- * Version: 1.4.9
+ * Version: 1.4.13
* Edition: log4javascript
- * Build date: 12 May 2014
+ * Build date: 23 May 2015
* Website: http://log4javascript.org
*/
-/* -------------------------------------------------------------------------- */
-// Array-related stuff
+(function(factory, root) {
+ if (typeof define == "function" && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(factory);
+ } else if (typeof module != "undefined" && typeof exports == "object") {
+ // Node/CommonJS style
+ module.exports = factory();
+ } else {
+ // No AMD or CommonJS support so we place log4javascript in (probably) the global variable
+ root.log4javascript = factory();
+ }
+})(function() {
+ // Array-related stuff. Next three methods are solely for IE5, which is missing them
+ if (!Array.prototype.push) {
+ Array.prototype.push = function() {
+ for (var i = 0, len = arguments.length; i < len; i++){
+ this[this.length] = arguments[i];
+ }
+ return this.length;
+ };
+ }
-// Next three methods are solely for IE5, which is missing them
-if (!Array.prototype.push) {
- Array.prototype.push = function() {
- for (var i = 0, len = arguments.length; i < len; i++){
- this[this.length] = arguments[i];
- }
- return this.length;
- };
-}
-
-if (!Array.prototype.shift) {
- Array.prototype.shift = function() {
- if (this.length > 0) {
- var firstItem = this[0];
- for (var i = 0, len = this.length - 1; i < len; i++) {
- this[i] = this[i + 1];
+ if (!Array.prototype.shift) {
+ Array.prototype.shift = function() {
+ if (this.length > 0) {
+ var firstItem = this[0];
+ for (var i = 0, len = this.length - 1; i < len; i++) {
+ this[i] = this[i + 1];
+ }
+ this.length = this.length - 1;
+ return firstItem;
}
- this.length = this.length - 1;
- return firstItem;
- }
- };
-}
-
-if (!Array.prototype.splice) {
- Array.prototype.splice = function(startIndex, deleteCount) {
- var itemsAfterDeleted = this.slice(startIndex + deleteCount);
- var itemsDeleted = this.slice(startIndex, startIndex + deleteCount);
- this.length = startIndex;
- // Copy the arguments into a proper Array object
- var argumentsArray = [];
- for (var i = 0, len = arguments.length; i < len; i++) {
- argumentsArray[i] = arguments[i];
- }
- var itemsToAppend = (argumentsArray.length > 2) ?
- itemsAfterDeleted = argumentsArray.slice(2).concat(itemsAfterDeleted) : itemsAfterDeleted;
- for (i = 0, len = itemsToAppend.length; i < len; i++) {
- this.push(itemsToAppend[i]);
- }
- return itemsDeleted;
- };
-}
+ };
+ }
-/* -------------------------------------------------------------------------- */
+ if (!Array.prototype.splice) {
+ Array.prototype.splice = function(startIndex, deleteCount) {
+ var itemsAfterDeleted = this.slice(startIndex + deleteCount);
+ var itemsDeleted = this.slice(startIndex, startIndex + deleteCount);
+ this.length = startIndex;
+ // Copy the arguments into a proper Array object
+ var argumentsArray = [];
+ for (var i = 0, len = arguments.length; i < len; i++) {
+ argumentsArray[i] = arguments[i];
+ }
+ var itemsToAppend = (argumentsArray.length > 2) ?
+ itemsAfterDeleted = argumentsArray.slice(2).concat(itemsAfterDeleted) : itemsAfterDeleted;
+ for (i = 0, len = itemsToAppend.length; i < len; i++) {
+ this.push(itemsToAppend[i]);
+ }
+ return itemsDeleted;
+ };
+ }
-var log4javascript = (function() {
+ /* ---------------------------------------------------------------------- */
function isUndefined(obj) {
return typeof obj == "undefined";
@@ -150,8 +157,8 @@ var log4javascript = (function() {
function Log4JavaScript() {}
Log4JavaScript.prototype = new EventSupport();
- log4javascript = new Log4JavaScript();
- log4javascript.version = "1.4.9";
+ var log4javascript = new Log4JavaScript();
+ log4javascript.version = "1.4.13";
log4javascript.edition = "log4javascript";
/* -------------------------------------------------------------------------- */
@@ -220,19 +227,11 @@ var log4javascript = (function() {
var urlEncode = (typeof window.encodeURIComponent != "undefined") ?
function(str) {
return encodeURIComponent(str);
- }:
+ }:
function(str) {
return escape(str).replace(/\+/g, "%2B").replace(/"/g, "%22").replace(/'/g, "%27").replace(/\//g, "%2F").replace(/=/g, "%3D");
};
- var urlDecode = (typeof window.decodeURIComponent != "undefined") ?
- function(str) {
- return decodeURIComponent(str);
- }:
- function(str) {
- return unescape(str).replace(/%2B/g, "+").replace(/%22/g, "\"").replace(/%27/g, "'").replace(/%2F/g, "/").replace(/%3D/g, "=");
- };
-
function array_remove(arr, val) {
var index = -1;
for (var i = 0, len = arr.length; i < len; i++) {
@@ -329,66 +328,6 @@ var log4javascript = (function() {
};
}
- function getListenersPropertyName(eventName) {
- return "__log4javascript_listeners__" + eventName;
- }
-
- function addEvent(node, eventName, listener, useCapture, win) {
- win = win ? win : window;
- if (node.addEventListener) {
- node.addEventListener(eventName, listener, useCapture);
- } else if (node.attachEvent) {
- node.attachEvent("on" + eventName, listener);
- } else {
- var propertyName = getListenersPropertyName(eventName);
- if (!node[propertyName]) {
- node[propertyName] = [];
- // Set event handler
- node["on" + eventName] = function(evt) {
- evt = getEvent(evt, win);
- var listenersPropertyName = getListenersPropertyName(eventName);
-
- // Clone the array of listeners to leave the original untouched
- var listeners = this[listenersPropertyName].concat([]);
- var currentListener;
-
- // Call each listener in turn
- while ((currentListener = listeners.shift())) {
- currentListener.call(this, evt);
- }
- };
- }
- node[propertyName].push(listener);
- }
- }
-
- function removeEvent(node, eventName, listener, useCapture) {
- if (node.removeEventListener) {
- node.removeEventListener(eventName, listener, useCapture);
- } else if (node.detachEvent) {
- node.detachEvent("on" + eventName, listener);
- } else {
- var propertyName = getListenersPropertyName(eventName);
- if (node[propertyName]) {
- array_remove(node[propertyName], listener);
- }
- }
- }
-
- function getEvent(evt, win) {
- win = win ? win : window;
- return evt ? evt : win.event;
- }
-
- function stopEventPropagation(evt) {
- if (evt.stopPropagation) {
- evt.stopPropagation();
- } else if (typeof evt.cancelBubble != "undefined") {
- evt.cancelBubble = true;
- }
- evt.returnValue = false;
- }
-
/* ---------------------------------------------------------------------- */
// Simple logging for log4javascript itself
@@ -465,7 +404,6 @@ var log4javascript = (function() {
log4javascript.isTimeStampsInMilliseconds = function() {
return useTimeStampsInMilliseconds;
};
-
// This evaluates the given expression in the current scope, thus allowing
// scripts to access private variables. Particularly useful for testing
@@ -543,7 +481,7 @@ var log4javascript = (function() {
var appenderCache = null;
var appenderCacheInvalidated = false;
-
+
this.addChild = function(childLogger) {
this.children.push(childLogger);
childLogger.parent = this;
@@ -609,7 +547,7 @@ var log4javascript = (function() {
}
return appenderCache;
};
-
+
this.invalidateAppenderCache = function() {
appenderCacheInvalidated = true;
for (var i = 0, len = this.children.length; i < len; i++) {
@@ -817,7 +755,7 @@ var log4javascript = (function() {
log4javascript.getLogger = function(loggerName) {
// Use default logger if loggerName is not specified or invalid
- if (!(typeof loggerName == "string")) {
+ if (typeof loggerName != "string") {
loggerName = anonymousLoggerName;
logLog.warn("log4javascript.getLogger: non-string logger name " +
toStr(loggerName) + " supplied, returning anonymous logger");
@@ -851,9 +789,7 @@ var log4javascript = (function() {
var defaultLogger = null;
log4javascript.getDefaultLogger = function() {
if (!defaultLogger) {
- defaultLogger = log4javascript.getLogger(defaultLoggerName);
- var a = new log4javascript.PopUpAppender();
- defaultLogger.addAppender(a);
+ defaultLogger = createDefaultLogger();
}
return defaultLogger;
};
@@ -1102,7 +1038,7 @@ var log4javascript = (function() {
log4javascript.Appender = Appender;
/* ---------------------------------------------------------------------- */
- // SimpleLayout
+ // SimpleLayout
function SimpleLayout() {
this.customFields = [];
@@ -1115,16 +1051,16 @@ var log4javascript = (function() {
};
SimpleLayout.prototype.ignoresThrowable = function() {
- return true;
+ return true;
};
SimpleLayout.prototype.toString = function() {
- return "SimpleLayout";
+ return "SimpleLayout";
};
log4javascript.SimpleLayout = SimpleLayout;
/* ----------------------------------------------------------------------- */
- // NullLayout
+ // NullLayout
function NullLayout() {
this.customFields = [];
@@ -1137,7 +1073,7 @@ var log4javascript = (function() {
};
NullLayout.prototype.ignoresThrowable = function() {
- return true;
+ return true;
};
NullLayout.prototype.formatWithException = function(loggingEvent) {
@@ -1146,7 +1082,7 @@ var log4javascript = (function() {
};
NullLayout.prototype.toString = function() {
- return "NullLayout";
+ return "NullLayout";
};
log4javascript.NullLayout = NullLayout;
@@ -1214,11 +1150,11 @@ var log4javascript = (function() {
};
XmlLayout.prototype.ignoresThrowable = function() {
- return false;
+ return false;
};
XmlLayout.prototype.toString = function() {
- return "XmlLayout";
+ return "XmlLayout";
};
log4javascript.XmlLayout = XmlLayout;
@@ -1255,56 +1191,56 @@ var log4javascript = (function() {
return this.combineMessages;
};
- JsonLayout.prototype.format = function(loggingEvent) {
- var layout = this;
- var dataValues = this.getDataValues(loggingEvent, this.combineMessages);
- var str = "{" + this.lineBreak;
- var i, len;
-
- function formatValue(val, prefix, expand) {
- // Check the type of the data value to decide whether quotation marks
- // or expansion are required
- var formattedValue;
- var valType = typeof val;
- if (val instanceof Date) {
- formattedValue = String(val.getTime());
- } else if (expand && (val instanceof Array)) {
- formattedValue = "[" + layout.lineBreak;
- for (var i = 0, len = val.length; i < len; i++) {
- var childPrefix = prefix + layout.tab;
- formattedValue += childPrefix + formatValue(val[i], childPrefix, false);
- if (i < val.length - 1) {
- formattedValue += ",";
- }
- formattedValue += layout.lineBreak;
- }
- formattedValue += prefix + "]";
- } else if (valType !== "number" && valType !== "boolean") {
- formattedValue = "\"" + escapeNewLines(toStr(val).replace(/\"/g, "\\\"")) + "\"";
- } else {
- formattedValue = val;
- }
- return formattedValue;
- }
-
- for (i = 0, len = dataValues.length - 1; i <= len; i++) {
- str += this.tab + "\"" + dataValues[i][0] + "\"" + this.colon + formatValue(dataValues[i][1], this.tab, true);
- if (i < len) {
- str += ",";
- }
- str += this.lineBreak;
- }
-
- str += "}" + this.lineBreak;
- return str;
- };
+ JsonLayout.prototype.format = function(loggingEvent) {
+ var layout = this;
+ var dataValues = this.getDataValues(loggingEvent, this.combineMessages);
+ var str = "{" + this.lineBreak;
+ var i, len;
+
+ function formatValue(val, prefix, expand) {
+ // Check the type of the data value to decide whether quotation marks
+ // or expansion are required
+ var formattedValue;
+ var valType = typeof val;
+ if (val instanceof Date) {
+ formattedValue = String(val.getTime());
+ } else if (expand && (val instanceof Array)) {
+ formattedValue = "[" + layout.lineBreak;
+ for (var i = 0, len = val.length; i < len; i++) {
+ var childPrefix = prefix + layout.tab;
+ formattedValue += childPrefix + formatValue(val[i], childPrefix, false);
+ if (i < val.length - 1) {
+ formattedValue += ",";
+ }
+ formattedValue += layout.lineBreak;
+ }
+ formattedValue += prefix + "]";
+ } else if (valType !== "number" && valType !== "boolean") {
+ formattedValue = "\"" + escapeNewLines(toStr(val).replace(/\"/g, "\\\"")) + "\"";
+ } else {
+ formattedValue = val;
+ }
+ return formattedValue;
+ }
+
+ for (i = 0, len = dataValues.length - 1; i <= len; i++) {
+ str += this.tab + "\"" + dataValues[i][0] + "\"" + this.colon + formatValue(dataValues[i][1], this.tab, true);
+ if (i < len) {
+ str += ",";
+ }
+ str += this.lineBreak;
+ }
+
+ str += "}" + this.lineBreak;
+ return str;
+ };
JsonLayout.prototype.ignoresThrowable = function() {
- return false;
+ return false;
};
JsonLayout.prototype.toString = function() {
- return "JsonLayout";
+ return "JsonLayout";
};
JsonLayout.prototype.getContentType = function() {
@@ -1340,11 +1276,11 @@ var log4javascript = (function() {
};
HttpPostDataLayout.prototype.ignoresThrowable = function(loggingEvent) {
- return false;
+ return false;
};
HttpPostDataLayout.prototype.toString = function() {
- return "HttpPostDataLayout";
+ return "HttpPostDataLayout";
};
log4javascript.HttpPostDataLayout = HttpPostDataLayout;
@@ -1355,7 +1291,7 @@ var log4javascript = (function() {
var objectsExpanded = [];
function doFormat(obj, depth, indentation) {
- var i, j, len, childDepth, childIndentation, childLines, expansion,
+ var i, len, childDepth, childIndentation, childLines, expansion,
childExpansion;
if (!indentation) {
@@ -1400,8 +1336,8 @@ var log4javascript = (function() {
}
expansion += childLines.join("," + newLine) + newLine + indentation + "]";
return expansion;
- } else if (Object.prototype.toString.call(obj) == "[object Date]") {
- return obj.toString();
+ } else if (Object.prototype.toString.call(obj) == "[object Date]") {
+ return obj.toString();
} else if (typeof obj == "object" && depth > 0) {
objectsExpanded.push(obj);
expansion = "{" + newLine;
@@ -1816,11 +1752,11 @@ var log4javascript = (function() {
fieldIndex = fieldIndex - 1;
}
}
- var val = this.customFields[fieldIndex].value;
- if (typeof val == "function") {
- val = val(this, loggingEvent);
- }
- replacement = val;
+ var val = this.customFields[fieldIndex].value;
+ if (typeof val == "function") {
+ val = val(this, loggingEvent);
+ }
+ replacement = val;
}
break;
case "n": // New line
@@ -1875,11 +1811,11 @@ var log4javascript = (function() {
};
PatternLayout.prototype.ignoresThrowable = function() {
- return true;
+ return true;
};
PatternLayout.prototype.toString = function() {
- return "PatternLayout";
+ return "PatternLayout";
};
log4javascript.PatternLayout = PatternLayout;
@@ -1914,18 +1850,18 @@ var log4javascript = (function() {
BrowserConsoleAppender.prototype.append = function(loggingEvent) {
var appender = this;
- var getFormattedMessage = function() {
+ var getFormattedMessage = function(concatenate) {
var formattedMessage = appender.getLayout().formatWithException(loggingEvent);
- return (typeof formattedMessage == "string") ? [formattedMessage] : formattedMessage;
+ return (typeof formattedMessage == "string") ?
+ (concatenate ? formattedMessage : [formattedMessage]) :
+ (concatenate ? formattedMessage.join(" ") : formattedMessage);
};
- var console;
-
- if ( (console = window.console) && console.log) { // Safari and Firebug
- var formattedMessage = getFormattedMessage();
+ var console = window.console;
+ if (console && console.log) {
// Log to Firebug or the browser console using specific logging
- // methods or revert to console.log otherwise
+ // methods or revert to console.log otherwise
var consoleMethodName;
if (console.debug && Level.DEBUG.isGreaterOrEqual(loggingEvent.level)) {
@@ -1940,13 +1876,13 @@ var log4javascript = (function() {
consoleMethodName = "log";
}
- if (console[consoleMethodName].apply) {
- console[consoleMethodName].apply(console, formattedMessage);
+ if (typeof console[consoleMethodName].apply == "function") {
+ console[consoleMethodName].apply(console, getFormattedMessage(false));
} else {
- console[consoleMethodName](formattedMessage);
+ console[consoleMethodName]( getFormattedMessage(true) );
}
} else if ((typeof opera != "undefined") && opera.postError) { // Opera
- opera.postError(getFormattedMessage());
+ opera.postError( getFormattedMessage(true) );
}
};
@@ -2230,10 +2166,6 @@ var log4javascript = (function() {
try {
var xmlHttp = getXmlHttp(xmlHttpErrorHandler);
if (isSupported) {
- // Add withCredentials to facilitate CORS requests with cookies
- if (withCredentials && withCredentialsSupported) {
- xmlHttp.withCredentials = true;
- }
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4) {
if (isHttpRequestSuccessful(xmlHttp)) {
@@ -2256,6 +2188,10 @@ var log4javascript = (function() {
}
};
xmlHttp.open("POST", url, true);
+ // Add withCredentials to facilitate CORS requests with cookies
+ if (withCredentials && withCredentialsSupported) {
+ xmlHttp.withCredentials = true;
+ }
try {
for (var i = 0, header; header = headers[i++]; ) {
xmlHttp.setRequestHeader(header.name, header.value);
@@ -2318,9 +2254,7 @@ var log4javascript = (function() {
if (oldBeforeUnload) {
oldBeforeUnload();
}
- if (sendAllRemaining()) {
- return "Sending log messages";
- }
+ sendAllRemaining();
};
}
// Start timer
@@ -2355,15 +2289,15 @@ var log4javascript = (function() {
// PopUpAppender and InPageAppender related
function setCookie(name, value, days, path) {
- var expires;
- path = path ? "; path=" + path : "";
+ var expires;
+ path = path ? "; path=" + path : "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toGMTString();
} else {
- expires = "";
- }
+ expires = "";
+ }
document.cookie = escape(name) + "=" + escape(value) + expires + path;
}
@@ -2373,11 +2307,11 @@ var log4javascript = (function() {
for (var i = 0, len = ca.length; i < len; i++) {
var c = ca[i];
while (c.charAt(0) === " ") {
- c = c.substring(1, c.length);
+ c = c.substring(1, c.length);
}
if (c.indexOf(nameEquals) === 0) {
- return unescape(c.substring(nameEquals.length, c.length));
- }
+ return unescape(c.substring(nameEquals.length, c.length));
+ }
}
return null;
}
@@ -2392,8 +2326,8 @@ var log4javascript = (function() {
return (lastSlash == -1) ? "" : scripts[i].src.substr(0, lastSlash + 1);
}
}
- return null;
- }
+ return null;
+ }
function isLoaded(win) {
try {
@@ -2576,7 +2510,7 @@ var log4javascript = (function() {
' }',
' } else {',
' var groupElementContainer = this;',
-' ',
+'',
' this.mainDiv = document.createElement("div");',
' this.mainDiv.className = "group";',
'',
@@ -2588,7 +2522,7 @@ var log4javascript = (function() {
' this.expander.unselectable = true;',
' var expanderText = this.group.expanded ? "-" : "+";',
' this.expanderTextNode = this.expander.appendChild(document.createTextNode(expanderText));',
-' ',
+'',
' this.headingDiv.appendChild(document.createTextNode(" " + this.group.name));',
'',
' this.contentDiv = this.mainDiv.appendChild(document.createElement("div"));',
@@ -3046,7 +2980,7 @@ var log4javascript = (function() {
' rootGroup = new Group("root", true);',
' rootGroup.render();',
' currentGroup = rootGroup;',
-' ',
+'',
' setCommandInputWidth();',
' setLogContainerHeight();',
' toggleLoggingEnabled();',
@@ -3171,9 +3105,9 @@ var log4javascript = (function() {
'',
' function LogItemContentReverser() {',
' }',
-' ',
+'',
' LogItemContentReverser.prototype = new LogItemVisitor();',
-' ',
+'',
' LogItemContentReverser.prototype.visitGroup = function(group) {',
' group.reverseChildren();',
' this.visitChildren(group);',
@@ -4193,10 +4127,10 @@ var log4javascript = (function() {
'',
' if (!Array.prototype.push) {',
' Array.prototype.push = function() {',
-' for (var i = 0, len = arguments.length; i < len; i++){',
-' this[this.length] = arguments[i];',
-' }',
-' return this.length;',
+' for (var i = 0, len = arguments.length; i < len; i++){',
+' this[this.length] = arguments[i];',
+' }',
+' return this.length;',
' };',
' }',
'',
@@ -4544,7 +4478,7 @@ var log4javascript = (function() {
' span.pre {',
' white-space: pre;',
' }',
-' ',
+'',
' pre.unwrapped {',
' display: inline !important;',
' }',
@@ -4728,8 +4662,7 @@ var log4javascript = (function() {
var showCommandLine = this.defaults.showCommandLine;
var commandLineObjectExpansionDepth = this.defaults.commandLineObjectExpansionDepth;
var showHideButton = this.defaults.showHideButton;
- var showCloseButton = this.defaults.showCloseButton;
- var showLogEntryDeleteButtons = this.defaults.showLogEntryDeleteButtons;
+ var showCloseButton = this.defaults.showCloseButton;
this.setLayout(this.defaults.layout);
@@ -4882,14 +4815,14 @@ var log4javascript = (function() {
}
};
- this.group = function(name, initiallyExpanded) {
+ this.group = function(name, initiallyExpanded) {
if (isSupported) {
queuedLoggingEvents.push(new QueuedGroup(name, initiallyExpanded));
checkAndAppend();
}
};
- this.groupEnd = function() {
+ this.groupEnd = function() {
if (isSupported) {
queuedLoggingEvents.push(new QueuedGroupEnd());
checkAndAppend();
@@ -4897,7 +4830,6 @@ var log4javascript = (function() {
};
var appendQueuedLoggingEvents = function() {
- var currentLoggingEvent;
while (queuedLoggingEvents.length > 0) {
queuedLoggingEvents.shift().append();
}
@@ -5009,9 +4941,9 @@ var log4javascript = (function() {
window.evalExpr = expr;
commandWindow.execScript("window.result=eval(window.evalExpr);");
result = window.result;
- } else {
- result = commandWindow.eval(expr);
- }
+ } else {
+ result = commandWindow.eval(expr);
+ }
commandOutput = isUndefined(result) ? result : formatObjectExpansion(result, commandLineObjectExpansionDepth);
// Restore variables in the command window to their original state
@@ -5517,8 +5449,7 @@ var log4javascript = (function() {
commandLineObjectExpansionDepth: 1,
showHideButton: false,
showCloseButton: true,
- showLogEntryDeleteButtons: true,
- useDocumentWrite: true
+ useDocumentWrite: true
};
PopUpAppender.prototype.toString = function() {
@@ -5550,8 +5481,8 @@ var log4javascript = (function() {
commandLineObjectExpansionDepth: 1,
showHideButton: false,
showCloseButton: false,
- showLogEntryDeleteButtons: true,
- useDocumentWrite: true
+ showLogEntryDeleteButtons: true,
+ useDocumentWrite: true
};
InPageAppender.prototype.toString = function() {
@@ -5642,7 +5573,6 @@ var log4javascript = (function() {
function getStyleAttributeValue(el) {
var stylePairs = el.style.cssText.split(";");
var styleValue = "";
- var isFirst = true;
for (var j = 0, len = stylePairs.length; j < len; j++) {
var nameValueBits = stylePairs[j].split(":");
var props = [];
@@ -5663,11 +5593,12 @@ var log4javascript = (function() {
return RegExp.$1.toLowerCase();
}
}
- return "";
+ return "";
}
var lt = "<";
var gt = ">";
+ var i, len;
if (includeRootNode && rootNode.nodeType != nodeTypes.DOCUMENT_FRAGMENT_NODE) {
switch (rootNode.nodeType) {
@@ -5713,7 +5644,7 @@ var log4javascript = (function() {
var childStartNewLine = !(rootNode.childNodes.length === 1 &&
rootNode.childNodes[0].nodeType === nodeTypes.TEXT_NODE);
var childPreformatted = array_contains(preFormattedElements, tagName);
- for (var i = 0, len = rootNode.childNodes.length; i < len; i++) {
+ for (i = 0, len = rootNode.childNodes.length; i < len; i++) {
xhtml += getXhtml(rootNode.childNodes[i], true, indentation + indentationUnit,
childStartNewLine, childPreformatted);
}
@@ -5732,7 +5663,7 @@ var log4javascript = (function() {
// Trim whitespace from each line of the text node
var lines = splitIntoLines(trim(rootNode.nodeValue));
var trimmedLines = [];
- for (var i = 0, len = lines.length; i < len; i++) {
+ for (i = 0, len = lines.length; i < len; i++) {
trimmedLines[i] = trim(lines[i]);
}
xhtml = trimmedLines.join(newLine + indentation);
@@ -5747,7 +5678,7 @@ var log4javascript = (function() {
case nodeTypes.DOCUMENT_NODE:
xhtml = "";
// Add output for childNodes collection (which doesn't include attribute nodes)
- for (var i = 0, len = rootNode.childNodes.length; i < len; i++) {
+ for (i = 0, len = rootNode.childNodes.length; i < len; i++) {
xhtml += getXhtml(rootNode.childNodes[i], true, indentation);
}
return xhtml;
@@ -5757,7 +5688,7 @@ var log4javascript = (function() {
} else {
xhtml = "";
// Add output for childNodes collection (which doesn't include attribute nodes)
- for (var i = 0, len = rootNode.childNodes.length; i < len; i++) {
+ for (i = 0, len = rootNode.childNodes.length; i < len; i++) {
xhtml += getXhtml(rootNode.childNodes[i], true, indentation + indentationUnit);
}
return xhtml;
@@ -5780,7 +5711,6 @@ var log4javascript = (function() {
ConsoleAppender.addGlobalCommandLineFunction("dirxml", function(appender, args, returnValue) {
var lines = [];
for (var i = 0, len = args.length; i < len; i++) {
- var win = appender.getCommandWindow();
lines[i] = getXhtml(args[i]);
}
return lines.join(newLine + newLine);
@@ -5857,36 +5787,40 @@ var log4javascript = (function() {
init();
})();
+ /* ---------------------------------------------------------------------- */
+
+ function createDefaultLogger() {
+ var logger = log4javascript.getLogger(defaultLoggerName);
+ var a = new log4javascript.PopUpAppender();
+ logger.addAppender(a);
+ return logger;
+ }
+
/* ---------------------------------------------------------------------- */
// Main load
- log4javascript.setDocumentReady = function() {
- pageLoaded = true;
- log4javascript.dispatchEvent("load", {});
- };
-
- if (window.addEventListener) {
- window.addEventListener("load", log4javascript.setDocumentReady, false);
- } else if (window.attachEvent) {
- window.attachEvent("onload", log4javascript.setDocumentReady);
- } else {
- var oldOnload = window.onload;
- if (typeof window.onload != "function") {
- window.onload = log4javascript.setDocumentReady;
- } else {
- window.onload = function(evt) {
- if (oldOnload) {
- oldOnload(evt);
- }
- log4javascript.setDocumentReady();
- };
- }
- }
-
- // Ensure that the log4javascript object is available in the window. This
- // is necessary for log4javascript to be available in IE if loaded using
- // Dojo's module system
- window.log4javascript = log4javascript;
-
- return log4javascript;
-})();
\ No newline at end of file
+ log4javascript.setDocumentReady = function() {
+ pageLoaded = true;
+ log4javascript.dispatchEvent("load", {});
+ };
+
+ if (window.addEventListener) {
+ window.addEventListener("load", log4javascript.setDocumentReady, false);
+ } else if (window.attachEvent) {
+ window.attachEvent("onload", log4javascript.setDocumentReady);
+ } else {
+ var oldOnload = window.onload;
+ if (typeof window.onload != "function") {
+ window.onload = log4javascript.setDocumentReady;
+ } else {
+ window.onload = function(evt) {
+ if (oldOnload) {
+ oldOnload(evt);
+ }
+ log4javascript.setDocumentReady();
+ };
+ }
+ }
+
+ return log4javascript;
+}, this);
\ No newline at end of file
diff --git a/js/stubs/log4javascript.js b/js/stubs/log4javascript.js
index 2f5eec0..9128a62 100644
--- a/js/stubs/log4javascript.js
+++ b/js/stubs/log4javascript.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,5 +19,5 @@ var log4javascript_stub=(function(){var log4javascript;function ff(){return func
function copy(obj,props){for(var i in props){obj[i]=props[i];}}
var f=ff();var Logger=ff();copy(Logger.prototype,{addChild:f,getEffectiveAppenders:f,invalidateAppenderCache:f,getAdditivity:f,setAdditivity:f,addAppender:f,removeAppender:f,removeAllAppenders:f,log:f,setLevel:f,getLevel:f,getEffectiveLevel:f,trace:f,debug:f,info:f,warn:f,error:f,fatal:f,isEnabledFor:f,isTraceEnabled:f,isDebugEnabled:f,isInfoEnabled:f,isWarnEnabled:f,isErrorEnabled:f,isFatalEnabled:f,callAppenders:f,group:f,groupEnd:f,time:f,timeEnd:f,assert:f,parent:new Logger()});var getLogger=function(){return new Logger();};function EventSupport(){}
copy(EventSupport.prototype,{setEventTypes:f,addEventListener:f,removeEventListener:f,dispatchEvent:f,eventTypes:[],eventListeners:{}});function Log4JavaScript(){}
-Log4JavaScript.prototype=new EventSupport();log4javascript=new Log4JavaScript();log4javascript={isStub:true,version:"1.4.9",edition:"log4javascript",setDocumentReady:f,setEventTypes:f,addEventListener:f,removeEventListener:f,dispatchEvent:f,eventTypes:[],eventListeners:{},logLog:{setQuietMode:f,setAlertAllErrors:f,debug:f,displayDebug:f,warn:f,error:f},handleError:f,setEnabled:f,isEnabled:f,setTimeStampsInMilliseconds:f,isTimeStampsInMilliseconds:f,evalInScope:f,setShowStackTraces:f,getLogger:getLogger,getDefaultLogger:getLogger,getNullLogger:getLogger,getRootLogger:getLogger,resetConfiguration:f,Level:ff(),LoggingEvent:ff(),Layout:ff(),Appender:ff()};log4javascript.LoggingEvent.prototype={getThrowableStrRep:f,getCombinedMessages:f};log4javascript.Level.prototype={toString:f,equals:f,isGreaterOrEqual:f};var level=new log4javascript.Level();copy(log4javascript.Level,{ALL:level,TRACE:level,DEBUG:level,INFO:level,WARN:level,ERROR:level,FATAL:level,OFF:level});log4javascript.Layout.prototype={defaults:{},format:f,ignoresThrowable:f,getContentType:f,allowBatching:f,getDataValues:f,setKeys:f,setCustomField:f,hasCustomFields:f,setTimeStampsInMilliseconds:f,isTimeStampsInMilliseconds:f,getTimeStampValue:f,toString:f};log4javascript.SimpleDateFormat=ff();log4javascript.SimpleDateFormat.prototype={setMinimalDaysInFirstWeek:f,getMinimalDaysInFirstWeek:f,format:f};log4javascript.PatternLayout=ff();log4javascript.PatternLayout.prototype=new log4javascript.Layout();log4javascript.Appender=ff();log4javascript.Appender.prototype=new EventSupport();copy(log4javascript.Appender.prototype,{layout:new log4javascript.PatternLayout(),threshold:log4javascript.Level.ALL,loggers:[],doAppend:f,append:f,setLayout:f,getLayout:f,setThreshold:f,getThreshold:f,setAddedToLogger:f,setRemovedFromLogger:f,group:f,groupEnd:f,toString:f});log4javascript.SimpleLayout=ff();log4javascript.SimpleLayout.prototype=new log4javascript.Layout();log4javascript.NullLayout=ff();log4javascript.NullLayout.prototype=new log4javascript.Layout();log4javascript.XmlLayout=ff();log4javascript.XmlLayout.prototype=new log4javascript.Layout();copy(log4javascript.XmlLayout.prototype,{escapeCdata:f,isCombinedMessages:f});log4javascript.JsonLayout=ff();log4javascript.JsonLayout.prototype=new log4javascript.Layout();copy(log4javascript.JsonLayout.prototype,{isReadable:f,isCombinedMessages:f});log4javascript.HttpPostDataLayout=ff();log4javascript.HttpPostDataLayout.prototype=new log4javascript.Layout();log4javascript.PatternLayout=ff();log4javascript.PatternLayout.prototype=new log4javascript.Layout();log4javascript.AlertAppender=ff();log4javascript.AlertAppender.prototype=new log4javascript.Appender();log4javascript.BrowserConsoleAppender=ff();log4javascript.BrowserConsoleAppender.prototype=new log4javascript.Appender();log4javascript.AjaxAppender=ff();log4javascript.AjaxAppender.prototype=new log4javascript.Appender();copy(log4javascript.AjaxAppender.prototype,{getSessionId:f,setSessionId:f,isTimed:f,setTimed:f,getTimerInterval:f,setTimerInterval:f,isWaitForResponse:f,setWaitForResponse:f,getBatchSize:f,setBatchSize:f,isSendAllOnUnload:f,setSendAllOnUnload:f,setRequestSuccessCallback:f,setFailCallback:f,getPostVarName:f,setPostVarName:f,sendAll:f,sendAllRemaining:f,defaults:{requestSuccessCallback:null,failCallback:null}});function ConsoleAppender(){}
+Log4JavaScript.prototype=new EventSupport();log4javascript=new Log4JavaScript();log4javascript={isStub:true,version:"1.4.13",edition:"log4javascript",setDocumentReady:f,setEventTypes:f,addEventListener:f,removeEventListener:f,dispatchEvent:f,eventTypes:[],eventListeners:{},logLog:{setQuietMode:f,setAlertAllErrors:f,debug:f,displayDebug:f,warn:f,error:f},handleError:f,setEnabled:f,isEnabled:f,setTimeStampsInMilliseconds:f,isTimeStampsInMilliseconds:f,evalInScope:f,setShowStackTraces:f,getLogger:getLogger,getDefaultLogger:getLogger,getNullLogger:getLogger,getRootLogger:getLogger,resetConfiguration:f,Level:ff(),LoggingEvent:ff(),Layout:ff(),Appender:ff()};log4javascript.LoggingEvent.prototype={getThrowableStrRep:f,getCombinedMessages:f};log4javascript.Level.prototype={toString:f,equals:f,isGreaterOrEqual:f};var level=new log4javascript.Level();copy(log4javascript.Level,{ALL:level,TRACE:level,DEBUG:level,INFO:level,WARN:level,ERROR:level,FATAL:level,OFF:level});log4javascript.Layout.prototype={defaults:{},format:f,ignoresThrowable:f,getContentType:f,allowBatching:f,getDataValues:f,setKeys:f,setCustomField:f,hasCustomFields:f,setTimeStampsInMilliseconds:f,isTimeStampsInMilliseconds:f,getTimeStampValue:f,toString:f};log4javascript.SimpleDateFormat=ff();log4javascript.SimpleDateFormat.prototype={setMinimalDaysInFirstWeek:f,getMinimalDaysInFirstWeek:f,format:f};log4javascript.PatternLayout=ff();log4javascript.PatternLayout.prototype=new log4javascript.Layout();log4javascript.Appender=ff();log4javascript.Appender.prototype=new EventSupport();copy(log4javascript.Appender.prototype,{layout:new log4javascript.PatternLayout(),threshold:log4javascript.Level.ALL,loggers:[],doAppend:f,append:f,setLayout:f,getLayout:f,setThreshold:f,getThreshold:f,setAddedToLogger:f,setRemovedFromLogger:f,group:f,groupEnd:f,toString:f});log4javascript.SimpleLayout=ff();log4javascript.SimpleLayout.prototype=new log4javascript.Layout();log4javascript.NullLayout=ff();log4javascript.NullLayout.prototype=new log4javascript.Layout();log4javascript.XmlLayout=ff();log4javascript.XmlLayout.prototype=new log4javascript.Layout();copy(log4javascript.XmlLayout.prototype,{escapeCdata:f,isCombinedMessages:f});log4javascript.JsonLayout=ff();log4javascript.JsonLayout.prototype=new log4javascript.Layout();copy(log4javascript.JsonLayout.prototype,{isReadable:f,isCombinedMessages:f});log4javascript.HttpPostDataLayout=ff();log4javascript.HttpPostDataLayout.prototype=new log4javascript.Layout();log4javascript.PatternLayout=ff();log4javascript.PatternLayout.prototype=new log4javascript.Layout();log4javascript.AlertAppender=ff();log4javascript.AlertAppender.prototype=new log4javascript.Appender();log4javascript.BrowserConsoleAppender=ff();log4javascript.BrowserConsoleAppender.prototype=new log4javascript.Appender();log4javascript.AjaxAppender=ff();log4javascript.AjaxAppender.prototype=new log4javascript.Appender();copy(log4javascript.AjaxAppender.prototype,{getSessionId:f,setSessionId:f,isTimed:f,setTimed:f,getTimerInterval:f,setTimerInterval:f,isWaitForResponse:f,setWaitForResponse:f,getBatchSize:f,setBatchSize:f,isSendAllOnUnload:f,setSendAllOnUnload:f,setRequestSuccessCallback:f,setFailCallback:f,getPostVarName:f,setPostVarName:f,sendAll:f,sendAllRemaining:f,defaults:{requestSuccessCallback:null,failCallback:null}});function ConsoleAppender(){}
ConsoleAppender.prototype=new log4javascript.Appender();copy(ConsoleAppender.prototype,{create:f,isNewestMessageAtTop:f,setNewestMessageAtTop:f,isScrollToLatestMessage:f,setScrollToLatestMessage:f,getWidth:f,setWidth:f,getHeight:f,setHeight:f,getMaxMessages:f,setMaxMessages:f,isShowCommandLine:f,setShowCommandLine:f,isShowHideButton:f,setShowHideButton:f,isShowCloseButton:f,setShowCloseButton:f,getCommandLineObjectExpansionDepth:f,setCommandLineObjectExpansionDepth:f,isInitiallyMinimized:f,setInitiallyMinimized:f,isUseDocumentWrite:f,setUseDocumentWrite:f,group:f,groupEnd:f,clear:f,focus:f,focusCommandLine:f,focusSearch:f,getCommandWindow:f,setCommandWindow:f,executeLastCommand:f,getCommandLayout:f,setCommandLayout:f,evalCommandAndAppend:f,addCommandLineFunction:f,storeCommandHistory:f,unload:f});ConsoleAppender.addGlobalCommandLineFunction=f;log4javascript.InPageAppender=ff();log4javascript.InPageAppender.prototype=new ConsoleAppender();copy(log4javascript.InPageAppender.prototype,{addCssProperty:f,hide:f,show:f,isVisible:f,close:f,defaults:{layout:new log4javascript.PatternLayout(),maxMessages:null}});log4javascript.InlineAppender=log4javascript.InPageAppender;log4javascript.PopUpAppender=ff();log4javascript.PopUpAppender.prototype=new ConsoleAppender();copy(log4javascript.PopUpAppender.prototype,{isUseOldPopUp:f,setUseOldPopUp:f,isComplainAboutPopUpBlocking:f,setComplainAboutPopUpBlocking:f,isFocusPopUp:f,setFocusPopUp:f,isReopenWhenClosed:f,setReopenWhenClosed:f,close:f,hide:f,show:f,defaults:{layout:new log4javascript.PatternLayout(),maxMessages:null}});return log4javascript;})();if(typeof window.log4javascript=="undefined"){var log4javascript=log4javascript_stub;}
diff --git a/js/stubs/log4javascript_lite.js b/js/stubs/log4javascript_lite.js
index 8955589..fcaa18d 100644
--- a/js/stubs/log4javascript_lite.js
+++ b/js/stubs/log4javascript_lite.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,4 +18,4 @@
var log4javascript_stub=(function(){var log4javascript;function ff(){return function(){};}
function copy(obj,props){for(var i in props){obj[i]=props[i];}}
var f=ff();var Logger=ff();copy(Logger.prototype,{setLevel:f,getLevel:f,trace:f,debug:f,info:f,warn:f,error:f,fatal:f,isEnabledFor:f,isTraceEnabled:f,isDebugEnabled:f,isInfoEnabled:f,isWarnEnabled:f,isErrorEnabled:f,isFatalEnabled:f});var getLogger=function(){return new Logger();};function Log4JavaScript(){}
-log4javascript=new Log4JavaScript();log4javascript={isStub:true,version:"1.4.9",edition:"log4javascript_lite",setEnabled:f,isEnabled:f,setShowStackTraces:f,getDefaultLogger:getLogger,getLogger:getLogger,getNullLogger:getLogger,Level:ff(),LoggingEvent:ff(),Appender:ff()};log4javascript.LoggingEvent.prototype={getThrowableStrRep:f,getCombinedMessages:f};log4javascript.Level.prototype={toString:f,equals:f,isGreaterOrEqual:f};var level=new log4javascript.Level();copy(log4javascript.Level,{ALL:level,TRACE:level,DEBUG:level,INFO:level,WARN:level,ERROR:level,FATAL:level,OFF:level});log4javascript.Appender.prototype.append=f;return log4javascript;})();if(typeof window.log4javascript=="undefined"){var log4javascript=log4javascript_stub;}
+log4javascript=new Log4JavaScript();log4javascript={isStub:true,version:"1.4.13",edition:"log4javascript_lite",setEnabled:f,isEnabled:f,setShowStackTraces:f,getDefaultLogger:getLogger,getLogger:getLogger,getNullLogger:getLogger,Level:ff(),LoggingEvent:ff(),Appender:ff()};log4javascript.LoggingEvent.prototype={getThrowableStrRep:f,getCombinedMessages:f};log4javascript.Level.prototype={toString:f,equals:f,isGreaterOrEqual:f};var level=new log4javascript.Level();copy(log4javascript.Level,{ALL:level,TRACE:level,DEBUG:level,INFO:level,WARN:level,ERROR:level,FATAL:level,OFF:level});log4javascript.Appender.prototype.append=f;return log4javascript;})();if(typeof window.log4javascript=="undefined"){var log4javascript=log4javascript_stub;}
diff --git a/js/stubs/log4javascript_lite_uncompressed.js b/js/stubs/log4javascript_lite_uncompressed.js
index 213e386..1a79a67 100644
--- a/js/stubs/log4javascript_lite_uncompressed.js
+++ b/js/stubs/log4javascript_lite_uncompressed.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -56,7 +56,7 @@ var log4javascript_stub = (function() {
log4javascript = {
isStub: true,
- version: "1.4.9",
+ version: "1.4.13",
edition: "log4javascript_lite",
setEnabled: f,
isEnabled: f,
@@ -92,7 +92,7 @@ var log4javascript_stub = (function() {
FATAL: level,
OFF: level
});
-
+
log4javascript.Appender.prototype.append = f;
return log4javascript;
diff --git a/js/stubs/log4javascript_production.js b/js/stubs/log4javascript_production.js
index 29ea121..3c5c83b 100644
--- a/js/stubs/log4javascript_production.js
+++ b/js/stubs/log4javascript_production.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,4 +19,4 @@ var log4javascript_stub=(function(){var log4javascript;function ff(){return func
function copy(obj,props){for(var i in props){obj[i]=props[i];}}
var f=ff();var Logger=ff();copy(Logger.prototype,{addChild:f,getEffectiveAppenders:f,invalidateAppenderCache:f,getAdditivity:f,setAdditivity:f,addAppender:f,removeAppender:f,removeAllAppenders:f,log:f,setLevel:f,getLevel:f,getEffectiveLevel:f,trace:f,debug:f,info:f,warn:f,error:f,fatal:f,isEnabledFor:f,isTraceEnabled:f,isDebugEnabled:f,isInfoEnabled:f,isWarnEnabled:f,isErrorEnabled:f,isFatalEnabled:f,callAppenders:f,group:f,groupEnd:f,time:f,timeEnd:f,assert:f,parent:new Logger()});var getLogger=function(){return new Logger();};function EventSupport(){}
copy(EventSupport.prototype,{setEventTypes:f,addEventListener:f,removeEventListener:f,dispatchEvent:f,eventTypes:[],eventListeners:{}});function Log4JavaScript(){}
-Log4JavaScript.prototype=new EventSupport();log4javascript=new Log4JavaScript();log4javascript={isStub:true,version:"1.4.9",edition:"log4javascript_production",setDocumentReady:f,setEventTypes:f,addEventListener:f,removeEventListener:f,dispatchEvent:f,eventTypes:[],eventListeners:{},logLog:{setQuietMode:f,setAlertAllErrors:f,debug:f,displayDebug:f,warn:f,error:f},handleError:f,setEnabled:f,isEnabled:f,setTimeStampsInMilliseconds:f,isTimeStampsInMilliseconds:f,evalInScope:f,setShowStackTraces:f,getLogger:getLogger,getDefaultLogger:getLogger,getNullLogger:getLogger,getRootLogger:getLogger,resetConfiguration:f,Level:ff(),LoggingEvent:ff(),Layout:ff(),Appender:ff()};log4javascript.LoggingEvent.prototype={getThrowableStrRep:f,getCombinedMessages:f};log4javascript.Level.prototype={toString:f,equals:f,isGreaterOrEqual:f};var level=new log4javascript.Level();copy(log4javascript.Level,{ALL:level,TRACE:level,DEBUG:level,INFO:level,WARN:level,ERROR:level,FATAL:level,OFF:level});log4javascript.Layout.prototype={defaults:{},format:f,ignoresThrowable:f,getContentType:f,allowBatching:f,getDataValues:f,setKeys:f,setCustomField:f,hasCustomFields:f,setTimeStampsInMilliseconds:f,isTimeStampsInMilliseconds:f,getTimeStampValue:f,toString:f};log4javascript.SimpleDateFormat=ff();log4javascript.SimpleDateFormat.prototype={setMinimalDaysInFirstWeek:f,getMinimalDaysInFirstWeek:f,format:f};log4javascript.PatternLayout=ff();log4javascript.PatternLayout.prototype=new log4javascript.Layout();log4javascript.Appender=ff();log4javascript.Appender.prototype=new EventSupport();copy(log4javascript.Appender.prototype,{layout:new log4javascript.PatternLayout(),threshold:log4javascript.Level.ALL,loggers:[],doAppend:f,append:f,setLayout:f,getLayout:f,setThreshold:f,getThreshold:f,setAddedToLogger:f,setRemovedFromLogger:f,group:f,groupEnd:f,toString:f});log4javascript.SimpleLayout=ff();log4javascript.SimpleLayout.prototype=new log4javascript.Layout();log4javascript.NullLayout=ff();log4javascript.NullLayout.prototype=new log4javascript.Layout();log4javascript.XmlLayout=ff();log4javascript.XmlLayout.prototype=new log4javascript.Layout();copy(log4javascript.XmlLayout.prototype,{escapeCdata:f,isCombinedMessages:f});log4javascript.JsonLayout=ff();log4javascript.JsonLayout.prototype=new log4javascript.Layout();copy(log4javascript.JsonLayout.prototype,{isReadable:f,isCombinedMessages:f});log4javascript.HttpPostDataLayout=ff();log4javascript.HttpPostDataLayout.prototype=new log4javascript.Layout();log4javascript.PatternLayout=ff();log4javascript.PatternLayout.prototype=new log4javascript.Layout();log4javascript.AjaxAppender=ff();log4javascript.AjaxAppender.prototype=new log4javascript.Appender();copy(log4javascript.AjaxAppender.prototype,{getSessionId:f,setSessionId:f,isTimed:f,setTimed:f,getTimerInterval:f,setTimerInterval:f,isWaitForResponse:f,setWaitForResponse:f,getBatchSize:f,setBatchSize:f,isSendAllOnUnload:f,setSendAllOnUnload:f,setRequestSuccessCallback:f,setFailCallback:f,getPostVarName:f,setPostVarName:f,sendAll:f,sendAllRemaining:f,defaults:{requestSuccessCallback:null,failCallback:null}});return log4javascript;})();if(typeof window.log4javascript=="undefined"){var log4javascript=log4javascript_stub;}
+Log4JavaScript.prototype=new EventSupport();log4javascript=new Log4JavaScript();log4javascript={isStub:true,version:"1.4.13",edition:"log4javascript_production",setDocumentReady:f,setEventTypes:f,addEventListener:f,removeEventListener:f,dispatchEvent:f,eventTypes:[],eventListeners:{},logLog:{setQuietMode:f,setAlertAllErrors:f,debug:f,displayDebug:f,warn:f,error:f},handleError:f,setEnabled:f,isEnabled:f,setTimeStampsInMilliseconds:f,isTimeStampsInMilliseconds:f,evalInScope:f,setShowStackTraces:f,getLogger:getLogger,getDefaultLogger:getLogger,getNullLogger:getLogger,getRootLogger:getLogger,resetConfiguration:f,Level:ff(),LoggingEvent:ff(),Layout:ff(),Appender:ff()};log4javascript.LoggingEvent.prototype={getThrowableStrRep:f,getCombinedMessages:f};log4javascript.Level.prototype={toString:f,equals:f,isGreaterOrEqual:f};var level=new log4javascript.Level();copy(log4javascript.Level,{ALL:level,TRACE:level,DEBUG:level,INFO:level,WARN:level,ERROR:level,FATAL:level,OFF:level});log4javascript.Layout.prototype={defaults:{},format:f,ignoresThrowable:f,getContentType:f,allowBatching:f,getDataValues:f,setKeys:f,setCustomField:f,hasCustomFields:f,setTimeStampsInMilliseconds:f,isTimeStampsInMilliseconds:f,getTimeStampValue:f,toString:f};log4javascript.SimpleDateFormat=ff();log4javascript.SimpleDateFormat.prototype={setMinimalDaysInFirstWeek:f,getMinimalDaysInFirstWeek:f,format:f};log4javascript.PatternLayout=ff();log4javascript.PatternLayout.prototype=new log4javascript.Layout();log4javascript.Appender=ff();log4javascript.Appender.prototype=new EventSupport();copy(log4javascript.Appender.prototype,{layout:new log4javascript.PatternLayout(),threshold:log4javascript.Level.ALL,loggers:[],doAppend:f,append:f,setLayout:f,getLayout:f,setThreshold:f,getThreshold:f,setAddedToLogger:f,setRemovedFromLogger:f,group:f,groupEnd:f,toString:f});log4javascript.SimpleLayout=ff();log4javascript.SimpleLayout.prototype=new log4javascript.Layout();log4javascript.NullLayout=ff();log4javascript.NullLayout.prototype=new log4javascript.Layout();log4javascript.XmlLayout=ff();log4javascript.XmlLayout.prototype=new log4javascript.Layout();copy(log4javascript.XmlLayout.prototype,{escapeCdata:f,isCombinedMessages:f});log4javascript.JsonLayout=ff();log4javascript.JsonLayout.prototype=new log4javascript.Layout();copy(log4javascript.JsonLayout.prototype,{isReadable:f,isCombinedMessages:f});log4javascript.HttpPostDataLayout=ff();log4javascript.HttpPostDataLayout.prototype=new log4javascript.Layout();log4javascript.PatternLayout=ff();log4javascript.PatternLayout.prototype=new log4javascript.Layout();log4javascript.AjaxAppender=ff();log4javascript.AjaxAppender.prototype=new log4javascript.Appender();copy(log4javascript.AjaxAppender.prototype,{getSessionId:f,setSessionId:f,isTimed:f,setTimed:f,getTimerInterval:f,setTimerInterval:f,isWaitForResponse:f,setWaitForResponse:f,getBatchSize:f,setBatchSize:f,isSendAllOnUnload:f,setSendAllOnUnload:f,setRequestSuccessCallback:f,setFailCallback:f,getPostVarName:f,setPostVarName:f,sendAll:f,sendAllRemaining:f,defaults:{requestSuccessCallback:null,failCallback:null}});return log4javascript;})();if(typeof window.log4javascript=="undefined"){var log4javascript=log4javascript_stub;}
diff --git a/js/stubs/log4javascript_production_uncompressed.js b/js/stubs/log4javascript_production_uncompressed.js
index 02e31e7..e321d7a 100644
--- a/js/stubs/log4javascript_production_uncompressed.js
+++ b/js/stubs/log4javascript_production_uncompressed.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -85,9 +85,9 @@ var log4javascript_stub = (function() {
log4javascript = {
isStub: true,
- version: "1.4.9",
+ version: "1.4.13",
edition: "log4javascript_production",
- setDocumentReady: f,
+ setDocumentReady: f,
setEventTypes: f,
addEventListener: f,
removeEventListener: f,
diff --git a/js/stubs/log4javascript_uncompressed.js b/js/stubs/log4javascript_uncompressed.js
index 3d2eecd..acc0af7 100644
--- a/js/stubs/log4javascript_uncompressed.js
+++ b/js/stubs/log4javascript_uncompressed.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -85,9 +85,9 @@ var log4javascript_stub = (function() {
log4javascript = {
isStub: true,
- version: "1.4.9",
+ version: "1.4.13",
edition: "log4javascript",
- setDocumentReady: f,
+ setDocumentReady: f,
setEventTypes: f,
addEventListener: f,
removeEventListener: f,
diff --git a/js/tests/log4javascript.js b/js/tests/log4javascript.js
index dc1a32f..31db603 100644
--- a/js/tests/log4javascript.js
+++ b/js/tests/log4javascript.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,7 +25,7 @@ return true;};var testLayoutWithVariables=function(layout,t){var emptyObject={};
for(var i=0;i\s*<\/log4javascript:message>\s*<\/log4javascript:event>\s*$/,t.appender.logMessages[0]);});s.test("XmlLayout with exception test",function(t){t.appender.setLayout(new log4javascript.XmlLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^\s*<\/log4javascript:message>\s*\s*<\/log4javascript:exception>\s*<\/log4javascript:event>\s*$/,t.appender.logMessages[0]);});var setUpXmlLayoutMillisecondsTest=function(t){t.date=new Date();t.timeInMilliseconds=t.date.getTime();t.timeInSeconds=Math.floor(t.timeInMilliseconds/1000);t.milliseconds=t.date.getMilliseconds();t.loggingEvent=new log4javascript.LoggingEvent(t.logger,t.date,log4javascript.Level.DEBUG,["TEST"],null);t.layout=new log4javascript.XmlLayout();}
-s.test("XmlLayout seconds/milliseconds test 1",function(t){setUpXmlLayoutMillisecondsTest(t);var regex=new RegExp('^\\s*\\s*\\s*$');t.assertRegexMatches(regex,t.layout.format(t.loggingEvent));});s.test("XmlLayout seconds/milliseconds test 2",function(t){setUpXmlLayoutMillisecondsTest(t);log4javascript.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);log4javascript.setTimeStampsInMilliseconds(true);var regex=new RegExp('^\\s*\\s*\\s*$');t.assertRegexMatches(regex,formatted);});s.test("XmlLayout seconds/milliseconds test 3",function(t){setUpXmlLayoutMillisecondsTest(t);t.layout.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);var regex=new RegExp('^\\s*\\s*\\s*$');t.assertRegexMatches(regex,formatted);});s.test("escapeNewLines test",function(t){var escapeNewLines=log4javascript.evalInScope("escapeNewLines");var str="1\r2\n3\n4\r\n5\r6\r\n7";t.assertEquals(escapeNewLines(str),"1\\r\\n2\\r\\n3\\r\\n4\\r\\n5\\r\\n6\\r\\n7");});s.test("JsonLayout format test",function(t){var layout=new log4javascript.JsonLayout();testLayoutWithVariables(layout,t);});s.test("JsonLayout test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST");t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/,t.appender.logMessages[0]);});s.test("JsonLayout JSON validity test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST");eval("var o = "+t.appender.logMessages[0]);t.assertEquals(o.message,"TEST");});s.test("JsonLayout with number type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug(15);t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/,t.appender.logMessages[0]);});s.test("JsonLayout with object type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug({});t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/,t.appender.logMessages[0]);});s.test("JsonLayout with boolean type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug(false);t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/,t.appender.logMessages[0]);});s.test("JsonLayout with quote test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TE\"S\"T");t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/,t.appender.logMessages[0]);});s.test("JsonLayout with exception test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/,t.appender.logMessages[0]);});var setUpJsonLayoutMillisecondsTest=function(t){t.date=new Date();t.timeInMilliseconds=t.date.getTime();t.timeInSeconds=Math.floor(t.timeInMilliseconds/1000);t.milliseconds=t.date.getMilliseconds();t.loggingEvent=new log4javascript.LoggingEvent(t.logger,t.date,log4javascript.Level.DEBUG,["TEST"],null);t.layout=new log4javascript.JsonLayout();};s.test("JsonLayout seconds/milliseconds test 1",function(t){setUpJsonLayoutMillisecondsTest(t);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInMilliseconds+',"level":"DEBUG","url":".*","message":"TEST"}$');t.assertRegexMatches(regex,t.layout.format(t.loggingEvent));});s.test("JsonLayout seconds/milliseconds test 2",function(t){setUpJsonLayoutMillisecondsTest(t);log4javascript.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);log4javascript.setTimeStampsInMilliseconds(true);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInSeconds+',"level":"DEBUG","url":".*","message":"TEST","milliseconds":'+t.milliseconds+'}$');t.assertRegexMatches(regex,formatted);});s.test("JsonLayout seconds/milliseconds test 3",function(t){setUpJsonLayoutMillisecondsTest(t);t.layout.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInSeconds+',"level":"DEBUG","url":".*","message":"TEST","milliseconds":'+t.milliseconds+'}$');t.assertRegexMatches(regex,formatted);});s.test("HttpPostDataLayout format test",function(t){var layout=new log4javascript.HttpPostDataLayout();testLayoutWithVariables(layout,t);});s.test("HttpPostDataLayout test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST");t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST$/,t.appender.logMessages[0]);});s.test("HttpPostDataLayout URL encoding test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST +\"1\"");t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/,t.appender.logMessages[0]);});s.test("HttpPostDataLayout with exception test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/,t.appender.logMessages[0]);});(function(){var formatObjectExpansion=log4javascript.evalInScope("formatObjectExpansion");var newLine=log4javascript.evalInScope("newLine");var arr=[null,undefined,1.2,"A string",[1,"test"],{a:{b:1}}];s.test("Basic formatObjectExpansion array test (depth: 1)",function(t){t.assertEquals(formatObjectExpansion(arr,1),"["+newLine+" null,"+newLine+" undefined,"+newLine+" 1.2,"+newLine+" A string,"+newLine+" 1,test,"+newLine+" [object Object]"+newLine+"]");});s.test("Basic formatObjectExpansion array test (depth: 2)",function(t){t.assertEquals(formatObjectExpansion(arr,2),"["+newLine+" null,"+newLine+" undefined,"+newLine+" 1.2,"+newLine+" A string,"+newLine+" ["+newLine+" 1,"+newLine+" test"+newLine+" ],"+newLine+" {"+newLine+" a: [object Object]"+newLine+" }"+newLine+"]");});s.test("formatObjectExpansion simple object test",function(t){var obj={STRING:"A string"};t.assertEquals(formatObjectExpansion(obj,1),"{"+newLine+" STRING: A string"+newLine+"}");});s.test("formatObjectExpansion simple circular object test",function(t){var obj={};obj.a=obj;t.assertEquals(formatObjectExpansion(obj,2),"{"+newLine+" a: [object Object] [already expanded]"+newLine+"}");});})();var getSampleDate=function(){var date=new Date();date.setFullYear(2006);date.setMonth(7);date.setDate(30);date.setHours(15);date.setMinutes(38);date.setSeconds(45);return date;};s.test("String.replace test",function(t){t.assertEquals("Hello world".replace(/o/g,"Z"),"HellZ wZrld");});s.test("PatternLayout format test",function(t){var layout=new log4javascript.PatternLayout();testLayoutWithVariables(layout,t);});s.test("PatternLayout dates test",function(t){var layout=new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertRegexMatches(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2},\d{3} \d{2}:\d{2}$/,t.appender.logMessages[0]);});s.test("PatternLayout modifiers test",function(t){var layout=new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertEquals(t.appender.logMessages[0],"TEST|TEST|TEST| TEST|TEST |ST|ST| TEST|ST|TEST |");});s.test("PatternLayout conversion characters test",function(t){var layout=new log4javascript.PatternLayout("%c %n %p %r literal %%");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/,t.appender.logMessages[0]);});s.test("PatternLayout message test",function(t){var layout=new log4javascript.PatternLayout("%m{1} %m{2}");t.appender.setLayout(layout);var testObj={strikers:{quick:"Marlon"}};t.logger.debug(testObj);t.assertEquals("{\r\n strikers: [object Object]\r\n} {\r\n\ strikers: {\r\n quick: Marlon\r\n }\r\n}",t.appender.logMessages[0]);});s.test("Logging/grouping test",function(t){var browserConsoleAppender=new log4javascript.BrowserConsoleAppender();t.logger.addAppender(browserConsoleAppender);t.logger.trace("TEST TRACE");t.logger.debug("TEST DEBUG");t.logger.info("TEST INFO");t.logger.warn("TEST WARN");t.logger.error("TEST ERROR");t.logger.fatal("TEST FATAL");t.logger.fatal("TEST FATAL",new Error("Fake error"));t.logger.info("TEST INFO","Second message",["a","b","c"]);t.logger.group("TEST GROUP");t.logger.info("TEST INFO");t.logger.groupEnd("TEST GROUP");t.logger.info("TEST INFO");t.logger.removeAppender(browserConsoleAppender);});var testConsoleAppender=function(t,appender){var timeoutCallback=function(){return(windowLoaded?"Timed out while waiting for messages to appear":"Timed out while waiting for window to load")+". Debug messages: "+
+s.test("XmlLayout seconds/milliseconds test 1",function(t){setUpXmlLayoutMillisecondsTest(t);var regex=new RegExp('^\\s*\\s*\\s*$');t.assertRegexMatches(regex,t.layout.format(t.loggingEvent));});s.test("XmlLayout seconds/milliseconds test 2",function(t){setUpXmlLayoutMillisecondsTest(t);log4javascript.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);log4javascript.setTimeStampsInMilliseconds(true);var regex=new RegExp('^\\s*\\s*\\s*$');t.assertRegexMatches(regex,formatted);});s.test("XmlLayout seconds/milliseconds test 3",function(t){setUpXmlLayoutMillisecondsTest(t);t.layout.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);var regex=new RegExp('^\\s*\\s*\\s*$');t.assertRegexMatches(regex,formatted);});s.test("escapeNewLines test",function(t){var escapeNewLines=log4javascript.evalInScope("escapeNewLines");var str="1\r2\n3\n4\r\n5\r6\r\n7";t.assertEquals(escapeNewLines(str),"1\\r\\n2\\r\\n3\\r\\n4\\r\\n5\\r\\n6\\r\\n7");});s.test("JsonLayout format test",function(t){var layout=new log4javascript.JsonLayout();testLayoutWithVariables(layout,t);});s.test("JsonLayout test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST");t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/,t.appender.logMessages[0]);});s.test("JsonLayout JSON validity test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST");eval("var o = "+t.appender.logMessages[0]);t.assertEquals(o.message,"TEST");});s.test("JsonLayout with number type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug(15);t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/,t.appender.logMessages[0]);});s.test("JsonLayout with object type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug({});t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/,t.appender.logMessages[0]);});s.test("JsonLayout with boolean type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug(false);t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/,t.appender.logMessages[0]);});s.test("JsonLayout with quote test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TE\"S\"T");t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/,t.appender.logMessages[0]);});s.test("JsonLayout with exception test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/,t.appender.logMessages[0]);});var setUpJsonLayoutMillisecondsTest=function(t){t.date=new Date();t.timeInMilliseconds=t.date.getTime();t.timeInSeconds=Math.floor(t.timeInMilliseconds/1000);t.milliseconds=t.date.getMilliseconds();t.loggingEvent=new log4javascript.LoggingEvent(t.logger,t.date,log4javascript.Level.DEBUG,["TEST"],null);t.layout=new log4javascript.JsonLayout();};s.test("JsonLayout seconds/milliseconds test 1",function(t){setUpJsonLayoutMillisecondsTest(t);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInMilliseconds+',"level":"DEBUG","url":".*","message":"TEST"}$');t.assertRegexMatches(regex,t.layout.format(t.loggingEvent));});s.test("JsonLayout seconds/milliseconds test 2",function(t){setUpJsonLayoutMillisecondsTest(t);log4javascript.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);log4javascript.setTimeStampsInMilliseconds(true);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInSeconds+',"level":"DEBUG","url":".*","message":"TEST","milliseconds":'+t.milliseconds+'}$');t.assertRegexMatches(regex,formatted);});s.test("JsonLayout seconds/milliseconds test 3",function(t){setUpJsonLayoutMillisecondsTest(t);t.layout.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInSeconds+',"level":"DEBUG","url":".*","message":"TEST","milliseconds":'+t.milliseconds+'}$');t.assertRegexMatches(regex,formatted);});s.test("HttpPostDataLayout format test",function(t){var layout=new log4javascript.HttpPostDataLayout();testLayoutWithVariables(layout,t);});s.test("HttpPostDataLayout test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST");t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST$/,t.appender.logMessages[0]);});s.test("HttpPostDataLayout URL encoding test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST +\"1\"");t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/,t.appender.logMessages[0]);});s.test("HttpPostDataLayout with exception test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/,t.appender.logMessages[0]);});(function(){var formatObjectExpansion=log4javascript.evalInScope("formatObjectExpansion");var newLine=log4javascript.evalInScope("newLine");var arr=[null,undefined,1.2,"A string",[1,"test"],{a:{b:1}}];s.test("Basic formatObjectExpansion array test (depth: 1)",function(t){t.assertEquals(formatObjectExpansion(arr,1),"["+newLine+" null,"+newLine+" undefined,"+newLine+" 1.2,"+newLine+" A string,"+newLine+" 1,test,"+newLine+" [object Object]"+newLine+"]");});s.test("Basic formatObjectExpansion array test (depth: 2)",function(t){t.assertEquals(formatObjectExpansion(arr,2),"["+newLine+" null,"+newLine+" undefined,"+newLine+" 1.2,"+newLine+" A string,"+newLine+" ["+newLine+" 1,"+newLine+" test"+newLine+" ],"+newLine+" {"+newLine+" a: [object Object]"+newLine+" }"+newLine+"]");});s.test("formatObjectExpansion simple object test",function(t){var obj={STRING:"A string"};t.assertEquals(formatObjectExpansion(obj,1),"{"+newLine+" STRING: A string"+newLine+"}");});s.test("formatObjectExpansion simple circular object test",function(t){var obj={};obj.a=obj;t.assertEquals(formatObjectExpansion(obj,2),"{"+newLine+" a: [object Object] [already expanded]"+newLine+"}");});})();var getSampleDate=function(){var date=new Date();date.setFullYear(2006);date.setMonth(7);date.setDate(30);date.setHours(15);date.setMinutes(38);date.setSeconds(45);return date;};s.test("String.replace test",function(t){t.assertEquals("Hello world".replace(/o/g,"Z"),"HellZ wZrld");});s.test("PatternLayout format test",function(t){var layout=new log4javascript.PatternLayout();testLayoutWithVariables(layout,t);});s.test("PatternLayout dates test",function(t){var layout=new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertRegexMatches(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2},\d{3} \d{2}:\d{2}$/,t.appender.logMessages[0]);});s.test("PatternLayout modifiers test",function(t){var layout=new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertEquals(t.appender.logMessages[0],"TEST|TEST|TEST| TEST|TEST |ST|ST| TEST|ST|TEST |");});s.test("PatternLayout conversion characters test",function(t){var layout=new log4javascript.PatternLayout("%c %n %p %r literal %%");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/,t.appender.logMessages[0]);});s.test("PatternLayout message test",function(t){var layout=new log4javascript.PatternLayout("%m{1} %m{2}");t.appender.setLayout(layout);var testObj={strikers:{quick:"Marlon"}};t.logger.debug(testObj);t.assertEquals("{\r\n strikers: [object Object]\r\n} {\r\n\ strikers: {\r\n quick: Marlon\r\n }\r\n}",t.appender.logMessages[0]);});s.test("Logging/grouping test",function(t){var browserConsoleAppender=new log4javascript.BrowserConsoleAppender();t.logger.addAppender(browserConsoleAppender);t.logger.trace("TEST TRACE");t.logger.debug("TEST DEBUG");t.logger.info("TEST INFO");t.logger.warn("TEST WARN");t.logger.error("TEST ERROR");t.logger.fatal("TEST FATAL");t.logger.fatal("TEST FATAL",new Error("Fake error"));t.logger.info("TEST INFO","Second message",["a","b","c"]);t.logger.group("TEST GROUP");t.logger.info("TEST INFO");t.logger.groupEnd("TEST GROUP");t.logger.info("TEST INFO");t.logger.removeAppender(browserConsoleAppender);});var testConsoleAppender=function(t,appender){var timeoutCallback=function(){return(windowLoaded?"Timed out while waiting for messages to appear":"Timed out while waiting for window to load")+". Debug messages: "+
log4javascript.logLog.debugMessages.join("\r\n");}
t.async(60000,timeoutCallback);var windowLoaded=false;var domChecked=false;var onLoadHandler=function(){log4javascript.logLog.debug("onLoadHandler");windowLoaded=true;var win=appender.getConsoleWindow();if(win&&win.loaded){var checkDom=function(){log4javascript.logLog.debug("checkDom");domChecked=true;var logContainer=win.logMainContainer;if(logContainer.hasChildNodes()){if(logContainer.innerHTML.indexOf("TEST MESSAGE")==-1){appender.close();t.fail("Log message not correctly logged (log container innerHTML: "+logContainer.innerHTML+")");}else{t.assert(appender.isVisible());appender.close();t.assert(!appender.isVisible());t.succeed();}}else{appender.close();t.fail("Console has no log messages");}}
window.setTimeout(checkDom,300);}else{appender.close();t.fail("Console mistakenly raised load event");}}
diff --git a/js/tests/log4javascript_lite.js b/js/tests/log4javascript_lite.js
index ecfb7ec..c8b2dca 100644
--- a/js/tests/log4javascript_lite.js
+++ b/js/tests/log4javascript_lite.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/js/tests/log4javascript_lite_uncompressed.js b/js/tests/log4javascript_lite_uncompressed.js
index ecfb7ec..c8b2dca 100644
--- a/js/tests/log4javascript_lite_uncompressed.js
+++ b/js/tests/log4javascript_lite_uncompressed.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/js/tests/log4javascript_production.js b/js/tests/log4javascript_production.js
index e4cf8f9..9322d74 100644
--- a/js/tests/log4javascript_production.js
+++ b/js/tests/log4javascript_production.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,4 +25,4 @@ return true;};var testLayoutWithVariables=function(layout,t){var emptyObject={};
for(var i=0;i\s*<\/log4javascript:message>\s*<\/log4javascript:event>\s*$/,t.appender.logMessages[0]);});s.test("XmlLayout with exception test",function(t){t.appender.setLayout(new log4javascript.XmlLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^\s*<\/log4javascript:message>\s*\s*<\/log4javascript:exception>\s*<\/log4javascript:event>\s*$/,t.appender.logMessages[0]);});var setUpXmlLayoutMillisecondsTest=function(t){t.date=new Date();t.timeInMilliseconds=t.date.getTime();t.timeInSeconds=Math.floor(t.timeInMilliseconds/1000);t.milliseconds=t.date.getMilliseconds();t.loggingEvent=new log4javascript.LoggingEvent(t.logger,t.date,log4javascript.Level.DEBUG,["TEST"],null);t.layout=new log4javascript.XmlLayout();}
-s.test("XmlLayout seconds/milliseconds test 1",function(t){setUpXmlLayoutMillisecondsTest(t);var regex=new RegExp('^\\s*\\s*\\s*$');t.assertRegexMatches(regex,t.layout.format(t.loggingEvent));});s.test("XmlLayout seconds/milliseconds test 2",function(t){setUpXmlLayoutMillisecondsTest(t);log4javascript.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);log4javascript.setTimeStampsInMilliseconds(true);var regex=new RegExp('^\\s*\\s*\\s*$');t.assertRegexMatches(regex,formatted);});s.test("XmlLayout seconds/milliseconds test 3",function(t){setUpXmlLayoutMillisecondsTest(t);t.layout.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);var regex=new RegExp('^\\s*\\s*\\s*$');t.assertRegexMatches(regex,formatted);});s.test("escapeNewLines test",function(t){var escapeNewLines=log4javascript.evalInScope("escapeNewLines");var str="1\r2\n3\n4\r\n5\r6\r\n7";t.assertEquals(escapeNewLines(str),"1\\r\\n2\\r\\n3\\r\\n4\\r\\n5\\r\\n6\\r\\n7");});s.test("JsonLayout format test",function(t){var layout=new log4javascript.JsonLayout();testLayoutWithVariables(layout,t);});s.test("JsonLayout test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST");t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/,t.appender.logMessages[0]);});s.test("JsonLayout JSON validity test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST");eval("var o = "+t.appender.logMessages[0]);t.assertEquals(o.message,"TEST");});s.test("JsonLayout with number type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug(15);t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/,t.appender.logMessages[0]);});s.test("JsonLayout with object type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug({});t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/,t.appender.logMessages[0]);});s.test("JsonLayout with boolean type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug(false);t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/,t.appender.logMessages[0]);});s.test("JsonLayout with quote test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TE\"S\"T");t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/,t.appender.logMessages[0]);});s.test("JsonLayout with exception test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/,t.appender.logMessages[0]);});var setUpJsonLayoutMillisecondsTest=function(t){t.date=new Date();t.timeInMilliseconds=t.date.getTime();t.timeInSeconds=Math.floor(t.timeInMilliseconds/1000);t.milliseconds=t.date.getMilliseconds();t.loggingEvent=new log4javascript.LoggingEvent(t.logger,t.date,log4javascript.Level.DEBUG,["TEST"],null);t.layout=new log4javascript.JsonLayout();};s.test("JsonLayout seconds/milliseconds test 1",function(t){setUpJsonLayoutMillisecondsTest(t);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInMilliseconds+',"level":"DEBUG","url":".*","message":"TEST"}$');t.assertRegexMatches(regex,t.layout.format(t.loggingEvent));});s.test("JsonLayout seconds/milliseconds test 2",function(t){setUpJsonLayoutMillisecondsTest(t);log4javascript.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);log4javascript.setTimeStampsInMilliseconds(true);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInSeconds+',"level":"DEBUG","url":".*","message":"TEST","milliseconds":'+t.milliseconds+'}$');t.assertRegexMatches(regex,formatted);});s.test("JsonLayout seconds/milliseconds test 3",function(t){setUpJsonLayoutMillisecondsTest(t);t.layout.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInSeconds+',"level":"DEBUG","url":".*","message":"TEST","milliseconds":'+t.milliseconds+'}$');t.assertRegexMatches(regex,formatted);});s.test("HttpPostDataLayout format test",function(t){var layout=new log4javascript.HttpPostDataLayout();testLayoutWithVariables(layout,t);});s.test("HttpPostDataLayout test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST");t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST$/,t.appender.logMessages[0]);});s.test("HttpPostDataLayout URL encoding test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST +\"1\"");t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/,t.appender.logMessages[0]);});s.test("HttpPostDataLayout with exception test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/,t.appender.logMessages[0]);});(function(){var formatObjectExpansion=log4javascript.evalInScope("formatObjectExpansion");var newLine=log4javascript.evalInScope("newLine");var arr=[null,undefined,1.2,"A string",[1,"test"],{a:{b:1}}];s.test("Basic formatObjectExpansion array test (depth: 1)",function(t){t.assertEquals(formatObjectExpansion(arr,1),"["+newLine+" null,"+newLine+" undefined,"+newLine+" 1.2,"+newLine+" A string,"+newLine+" 1,test,"+newLine+" [object Object]"+newLine+"]");});s.test("Basic formatObjectExpansion array test (depth: 2)",function(t){t.assertEquals(formatObjectExpansion(arr,2),"["+newLine+" null,"+newLine+" undefined,"+newLine+" 1.2,"+newLine+" A string,"+newLine+" ["+newLine+" 1,"+newLine+" test"+newLine+" ],"+newLine+" {"+newLine+" a: [object Object]"+newLine+" }"+newLine+"]");});s.test("formatObjectExpansion simple object test",function(t){var obj={STRING:"A string"};t.assertEquals(formatObjectExpansion(obj,1),"{"+newLine+" STRING: A string"+newLine+"}");});s.test("formatObjectExpansion simple circular object test",function(t){var obj={};obj.a=obj;t.assertEquals(formatObjectExpansion(obj,2),"{"+newLine+" a: [object Object] [already expanded]"+newLine+"}");});})();var getSampleDate=function(){var date=new Date();date.setFullYear(2006);date.setMonth(7);date.setDate(30);date.setHours(15);date.setMinutes(38);date.setSeconds(45);return date;};s.test("String.replace test",function(t){t.assertEquals("Hello world".replace(/o/g,"Z"),"HellZ wZrld");});s.test("PatternLayout format test",function(t){var layout=new log4javascript.PatternLayout();testLayoutWithVariables(layout,t);});s.test("PatternLayout dates test",function(t){var layout=new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertRegexMatches(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2},\d{3} \d{2}:\d{2}$/,t.appender.logMessages[0]);});s.test("PatternLayout modifiers test",function(t){var layout=new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertEquals(t.appender.logMessages[0],"TEST|TEST|TEST| TEST|TEST |ST|ST| TEST|ST|TEST |");});s.test("PatternLayout conversion characters test",function(t){var layout=new log4javascript.PatternLayout("%c %n %p %r literal %%");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/,t.appender.logMessages[0]);});s.test("PatternLayout message test",function(t){var layout=new log4javascript.PatternLayout("%m{1} %m{2}");t.appender.setLayout(layout);var testObj={strikers:{quick:"Marlon"}};t.logger.debug(testObj);t.assertEquals("{\r\n strikers: [object Object]\r\n} {\r\n\ strikers: {\r\n quick: Marlon\r\n }\r\n}",t.appender.logMessages[0]);});});
+s.test("XmlLayout seconds/milliseconds test 1",function(t){setUpXmlLayoutMillisecondsTest(t);var regex=new RegExp('^\\s*\\s*\\s*$');t.assertRegexMatches(regex,t.layout.format(t.loggingEvent));});s.test("XmlLayout seconds/milliseconds test 2",function(t){setUpXmlLayoutMillisecondsTest(t);log4javascript.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);log4javascript.setTimeStampsInMilliseconds(true);var regex=new RegExp('^\\s*\\s*\\s*$');t.assertRegexMatches(regex,formatted);});s.test("XmlLayout seconds/milliseconds test 3",function(t){setUpXmlLayoutMillisecondsTest(t);t.layout.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);var regex=new RegExp('^\\s*\\s*\\s*$');t.assertRegexMatches(regex,formatted);});s.test("escapeNewLines test",function(t){var escapeNewLines=log4javascript.evalInScope("escapeNewLines");var str="1\r2\n3\n4\r\n5\r6\r\n7";t.assertEquals(escapeNewLines(str),"1\\r\\n2\\r\\n3\\r\\n4\\r\\n5\\r\\n6\\r\\n7");});s.test("JsonLayout format test",function(t){var layout=new log4javascript.JsonLayout();testLayoutWithVariables(layout,t);});s.test("JsonLayout test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST");t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/,t.appender.logMessages[0]);});s.test("JsonLayout JSON validity test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST");eval("var o = "+t.appender.logMessages[0]);t.assertEquals(o.message,"TEST");});s.test("JsonLayout with number type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug(15);t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/,t.appender.logMessages[0]);});s.test("JsonLayout with object type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug({});t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/,t.appender.logMessages[0]);});s.test("JsonLayout with boolean type message test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug(false);t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/,t.appender.logMessages[0]);});s.test("JsonLayout with quote test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TE\"S\"T");t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/,t.appender.logMessages[0]);});s.test("JsonLayout with exception test",function(t){t.appender.setLayout(new log4javascript.JsonLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/,t.appender.logMessages[0]);});var setUpJsonLayoutMillisecondsTest=function(t){t.date=new Date();t.timeInMilliseconds=t.date.getTime();t.timeInSeconds=Math.floor(t.timeInMilliseconds/1000);t.milliseconds=t.date.getMilliseconds();t.loggingEvent=new log4javascript.LoggingEvent(t.logger,t.date,log4javascript.Level.DEBUG,["TEST"],null);t.layout=new log4javascript.JsonLayout();};s.test("JsonLayout seconds/milliseconds test 1",function(t){setUpJsonLayoutMillisecondsTest(t);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInMilliseconds+',"level":"DEBUG","url":".*","message":"TEST"}$');t.assertRegexMatches(regex,t.layout.format(t.loggingEvent));});s.test("JsonLayout seconds/milliseconds test 2",function(t){setUpJsonLayoutMillisecondsTest(t);log4javascript.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);log4javascript.setTimeStampsInMilliseconds(true);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInSeconds+',"level":"DEBUG","url":".*","message":"TEST","milliseconds":'+t.milliseconds+'}$');t.assertRegexMatches(regex,formatted);});s.test("JsonLayout seconds/milliseconds test 3",function(t){setUpJsonLayoutMillisecondsTest(t);t.layout.setTimeStampsInMilliseconds(false);var formatted=t.layout.format(t.loggingEvent);var regex=new RegExp('^{"logger":"test","timestamp":'+t.timeInSeconds+',"level":"DEBUG","url":".*","message":"TEST","milliseconds":'+t.milliseconds+'}$');t.assertRegexMatches(regex,formatted);});s.test("HttpPostDataLayout format test",function(t){var layout=new log4javascript.HttpPostDataLayout();testLayoutWithVariables(layout,t);});s.test("HttpPostDataLayout test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST");t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST$/,t.appender.logMessages[0]);});s.test("HttpPostDataLayout URL encoding test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST +\"1\"");t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/,t.appender.logMessages[0]);});s.test("HttpPostDataLayout with exception test",function(t){t.appender.setLayout(new log4javascript.HttpPostDataLayout());t.logger.debug("TEST",new Error("Test error"));t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/,t.appender.logMessages[0]);});(function(){var formatObjectExpansion=log4javascript.evalInScope("formatObjectExpansion");var newLine=log4javascript.evalInScope("newLine");var arr=[null,undefined,1.2,"A string",[1,"test"],{a:{b:1}}];s.test("Basic formatObjectExpansion array test (depth: 1)",function(t){t.assertEquals(formatObjectExpansion(arr,1),"["+newLine+" null,"+newLine+" undefined,"+newLine+" 1.2,"+newLine+" A string,"+newLine+" 1,test,"+newLine+" [object Object]"+newLine+"]");});s.test("Basic formatObjectExpansion array test (depth: 2)",function(t){t.assertEquals(formatObjectExpansion(arr,2),"["+newLine+" null,"+newLine+" undefined,"+newLine+" 1.2,"+newLine+" A string,"+newLine+" ["+newLine+" 1,"+newLine+" test"+newLine+" ],"+newLine+" {"+newLine+" a: [object Object]"+newLine+" }"+newLine+"]");});s.test("formatObjectExpansion simple object test",function(t){var obj={STRING:"A string"};t.assertEquals(formatObjectExpansion(obj,1),"{"+newLine+" STRING: A string"+newLine+"}");});s.test("formatObjectExpansion simple circular object test",function(t){var obj={};obj.a=obj;t.assertEquals(formatObjectExpansion(obj,2),"{"+newLine+" a: [object Object] [already expanded]"+newLine+"}");});})();var getSampleDate=function(){var date=new Date();date.setFullYear(2006);date.setMonth(7);date.setDate(30);date.setHours(15);date.setMinutes(38);date.setSeconds(45);return date;};s.test("String.replace test",function(t){t.assertEquals("Hello world".replace(/o/g,"Z"),"HellZ wZrld");});s.test("PatternLayout format test",function(t){var layout=new log4javascript.PatternLayout();testLayoutWithVariables(layout,t);});s.test("PatternLayout dates test",function(t){var layout=new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertRegexMatches(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2},\d{3} \d{2}:\d{2}$/,t.appender.logMessages[0]);});s.test("PatternLayout modifiers test",function(t){var layout=new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertEquals(t.appender.logMessages[0],"TEST|TEST|TEST| TEST|TEST |ST|ST| TEST|ST|TEST |");});s.test("PatternLayout conversion characters test",function(t){var layout=new log4javascript.PatternLayout("%c %n %p %r literal %%");t.appender.setLayout(layout);t.logger.debug("TEST");t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/,t.appender.logMessages[0]);});s.test("PatternLayout message test",function(t){var layout=new log4javascript.PatternLayout("%m{1} %m{2}");t.appender.setLayout(layout);var testObj={strikers:{quick:"Marlon"}};t.logger.debug(testObj);t.assertEquals("{\r\n strikers: [object Object]\r\n} {\r\n\ strikers: {\r\n quick: Marlon\r\n }\r\n}",t.appender.logMessages[0]);});});
diff --git a/js/tests/log4javascript_production_uncompressed.js b/js/tests/log4javascript_production_uncompressed.js
index a44cb1b..5f3fa40 100644
--- a/js/tests/log4javascript_production_uncompressed.js
+++ b/js/tests/log4javascript_production_uncompressed.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -134,25 +134,25 @@ xn.test.suite("log4javascript tests", function(s) {
return "[ArrayAppender]";
};
- s.setUp = function(t) {
- t.logger = log4javascript.getLogger("test");
+ s.setUp = function(t) {
+ t.logger = log4javascript.getLogger("test");
t.logger.removeAllAppenders();
t.appender = new ArrayAppender();
- t.logger.addAppender(t.appender);
- };
+ t.logger.addAppender(t.appender);
+ };
- s.tearDown = function(t) {
- t.logger.removeAppender(t.appender);
+ s.tearDown = function(t) {
+ t.logger.removeAppender(t.appender);
log4javascript.resetConfiguration();
};
- s.test("Stub script interface test", function(t) {
- try {
- compareObjectInterface(log4javascript, "log4javascript", log4javascript_stub, "log4javascript_stub");
- } catch (ex) {
- t.fail(ex);
- }
- });
+ s.test("Stub script interface test", function(t) {
+ try {
+ compareObjectInterface(log4javascript, "log4javascript", log4javascript_stub, "log4javascript_stub");
+ } catch (ex) {
+ t.fail(ex);
+ }
+ });
s.test("Disable log4javascript test", function(t) {
log4javascript.setEnabled(false);
@@ -161,26 +161,26 @@ xn.test.suite("log4javascript tests", function(s) {
log4javascript.setEnabled(true);
});
- s.test("Array.splice test 1", function(t) {
- var a = ["Marlon", "Ashley", "Darius", "Lloyd"];
- var deletedItems = a.splice(1, 2);
- t.assertEquals(a.join(","), "Marlon,Lloyd");
- t.assertEquals(deletedItems.join(","), "Ashley,Darius");
- });
+ s.test("Array.splice test 1", function(t) {
+ var a = ["Marlon", "Ashley", "Darius", "Lloyd"];
+ var deletedItems = a.splice(1, 2);
+ t.assertEquals(a.join(","), "Marlon,Lloyd");
+ t.assertEquals(deletedItems.join(","), "Ashley,Darius");
+ });
- s.test("Array.splice test 2", function(t) {
- var a = ["Marlon", "Ashley", "Darius", "Lloyd"];
- var deletedItems = a.splice(1, 1, "Malky", "Jay");
- t.assertEquals(a.join(","), "Marlon,Malky,Jay,Darius,Lloyd");
- t.assertEquals(deletedItems.join(","), "Ashley");
- });
+ s.test("Array.splice test 2", function(t) {
+ var a = ["Marlon", "Ashley", "Darius", "Lloyd"];
+ var deletedItems = a.splice(1, 1, "Malky", "Jay");
+ t.assertEquals(a.join(","), "Marlon,Malky,Jay,Darius,Lloyd");
+ t.assertEquals(deletedItems.join(","), "Ashley");
+ });
- s.test("array_remove test", function(t) {
- var array_remove = log4javascript.evalInScope("array_remove");
- var a = ["Marlon", "Ashley", "Darius"];
- array_remove(a, "Darius");
- t.assertEquals(a.join(","), "Marlon,Ashley");
- });
+ s.test("array_remove test", function(t) {
+ var array_remove = log4javascript.evalInScope("array_remove");
+ var a = ["Marlon", "Ashley", "Darius"];
+ array_remove(a, "Darius");
+ t.assertEquals(a.join(","), "Marlon,Ashley");
+ });
s.test("array_remove with empty array test", function(t) {
var array_remove = log4javascript.evalInScope("array_remove");
@@ -189,20 +189,20 @@ xn.test.suite("log4javascript tests", function(s) {
t.assertEquals(a.join(","), "");
});
- s.test("Logger logging test", function(t) {
- // Should log since the default level for loggers is DEBUG and
- // the default threshold for appenders is ALL
- t.logger.debug("TEST");
- t.assertEquals(t.appender.logMessages.length, 1);
- });
+ s.test("Logger logging test", function(t) {
+ // Should log since the default level for loggers is DEBUG and
+ // the default threshold for appenders is ALL
+ t.logger.debug("TEST");
+ t.assertEquals(t.appender.logMessages.length, 1);
+ });
- s.test("Logger levels test", function(t) {
- var originalLevel = t.logger.getEffectiveLevel();
- t.logger.setLevel(log4javascript.Level.INFO);
- t.logger.debug("TEST");
+ s.test("Logger levels test", function(t) {
+ var originalLevel = t.logger.getEffectiveLevel();
+ t.logger.setLevel(log4javascript.Level.INFO);
+ t.logger.debug("TEST");
t.logger.setLevel(originalLevel);
- t.assertEquals(t.appender.logMessages.length, 0);
- });
+ t.assertEquals(t.appender.logMessages.length, 0);
+ });
s.test("Logger getEffectiveLevel inheritance test 1", function(t) {
var parentLogger = log4javascript.getLogger("test1");
@@ -296,22 +296,22 @@ xn.test.suite("log4javascript tests", function(s) {
});
s.test("Appender threshold test", function(t) {
- t.appender.setThreshold(log4javascript.Level.INFO);
- t.logger.debug("TEST");
- t.assertEquals(t.appender.logMessages.length, 0);
- });
+ t.appender.setThreshold(log4javascript.Level.INFO);
+ t.logger.debug("TEST");
+ t.assertEquals(t.appender.logMessages.length, 0);
+ });
- s.test("Basic appender / layout test", function(t) {
- t.logger.debug("TEST");
+ s.test("Basic appender / layout test", function(t) {
+ t.logger.debug("TEST");
t.assertEquals(t.appender.logMessages[0], "TEST");
- });
+ });
s.test("Appender uniqueness within logger test", function(t) {
// Add the same appender to the logger for a second time
t.logger.addAppender(t.appender);
- t.logger.debug("TEST");
- t.assertEquals(t.appender.logMessages.length, 1);
- });
+ t.logger.debug("TEST");
+ t.assertEquals(t.appender.logMessages.length, 1);
+ });
s.test("Logger remove appender test", function(t) {
t.logger.debug("TEST");
@@ -331,44 +331,44 @@ xn.test.suite("log4javascript tests", function(s) {
testLayoutWithVariables(layout, t);
});
- s.test("SimpleLayout test", function(t) {
- t.appender.setLayout(new log4javascript.SimpleLayout());
- t.logger.debug("TEST");
- t.assertEquals(t.appender.logMessages[0], "DEBUG - TEST");
- });
+ s.test("SimpleLayout test", function(t) {
+ t.appender.setLayout(new log4javascript.SimpleLayout());
+ t.logger.debug("TEST");
+ t.assertEquals(t.appender.logMessages[0], "DEBUG - TEST");
+ });
s.test("NullLayout format test", function(t) {
var layout = new log4javascript.NullLayout();
testLayoutWithVariables(layout, t);
});
- s.test("NullLayout test", function(t) {
- t.appender.setLayout(new log4javascript.NullLayout());
- t.logger.debug("TEST");
- t.assertEquals(t.appender.logMessages[0], "TEST");
- });
+ s.test("NullLayout test", function(t) {
+ t.appender.setLayout(new log4javascript.NullLayout());
+ t.logger.debug("TEST");
+ t.assertEquals(t.appender.logMessages[0], "TEST");
+ });
s.test("XmlLayout format test", function(t) {
var layout = new log4javascript.XmlLayout();
testLayoutWithVariables(layout, t);
});
- s.test("XmlLayout test", function(t) {
- t.appender.setLayout(new log4javascript.XmlLayout());
- t.logger.debug("TEST");
- t.assertRegexMatches(/^\s*<\/log4javascript:message>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);
- });
+ s.test("XmlLayout test", function(t) {
+ t.appender.setLayout(new log4javascript.XmlLayout());
+ t.logger.debug("TEST");
+ t.assertRegexMatches(/^\s*<\/log4javascript:message>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);
+ });
- s.test("XmlLayout with exception test", function(t) {
- t.appender.setLayout(new log4javascript.XmlLayout());
- t.logger.debug("TEST", new Error("Test error"));
- t.assertRegexMatches(/^\s*<\/log4javascript:message>\s*\s*<\/log4javascript:exception>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);
- });
+ s.test("XmlLayout with exception test", function(t) {
+ t.appender.setLayout(new log4javascript.XmlLayout());
+ t.logger.debug("TEST", new Error("Test error"));
+ t.assertRegexMatches(/^\s*<\/log4javascript:message>\s*\s*<\/log4javascript:exception>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);
+ });
var setUpXmlLayoutMillisecondsTest = function(t) {
t.date = new Date();
t.timeInMilliseconds = t.date.getTime();
t.timeInSeconds = Math.floor(t.timeInMilliseconds / 1000);
t.milliseconds = t.date.getMilliseconds();
-
+
t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);
t.layout = new log4javascript.XmlLayout();
}
@@ -377,29 +377,29 @@ xn.test.suite("log4javascript tests", function(s) {
setUpXmlLayoutMillisecondsTest(t);
// Test default (i.e. timestamps in milliseconds) first
- var regex = new RegExp('^\\s*\\s*\\s*$');
- t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));
+ var regex = new RegExp('^\\s*\\s*\\s*$');
+ t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));
});
-
+
s.test("XmlLayout seconds/milliseconds test 2", function(t) {
setUpXmlLayoutMillisecondsTest(t);
- // Change the global setting
- log4javascript.setTimeStampsInMilliseconds(false);
- var formatted = t.layout.format(t.loggingEvent);
- log4javascript.setTimeStampsInMilliseconds(true);
- var regex = new RegExp('^\\s*\\s*\\s*$');
- t.assertRegexMatches(regex, formatted);
+ // Change the global setting
+ log4javascript.setTimeStampsInMilliseconds(false);
+ var formatted = t.layout.format(t.loggingEvent);
+ log4javascript.setTimeStampsInMilliseconds(true);
+ var regex = new RegExp('^\\s*\\s*\\s*$');
+ t.assertRegexMatches(regex, formatted);
});
s.test("XmlLayout seconds/milliseconds test 3", function(t) {
setUpXmlLayoutMillisecondsTest(t);
- // Change the layout setting
- t.layout.setTimeStampsInMilliseconds(false);
- var formatted = t.layout.format(t.loggingEvent);
- var regex = new RegExp('^\\s*\\s*\\s*$');
- t.assertRegexMatches(regex, formatted);
+ // Change the layout setting
+ t.layout.setTimeStampsInMilliseconds(false);
+ var formatted = t.layout.format(t.loggingEvent);
+ var regex = new RegExp('^\\s*\\s*\\s*$');
+ t.assertRegexMatches(regex, formatted);
});
s.test("escapeNewLines test", function(t) {
var escapeNewLines = log4javascript.evalInScope("escapeNewLines");
@@ -412,55 +412,55 @@ xn.test.suite("log4javascript tests", function(s) {
testLayoutWithVariables(layout, t);
});
- s.test("JsonLayout test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug("TEST");
- t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/, t.appender.logMessages[0]);
- });
-
- s.test("JsonLayout JSON validity test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug("TEST");
- eval("var o = " + t.appender.logMessages[0]);
- t.assertEquals(o.message, "TEST");
- });
-
- s.test("JsonLayout with number type message test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug(15);
- t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/, t.appender.logMessages[0]);
- });
-
- s.test("JsonLayout with object type message test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug({});
- t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/, t.appender.logMessages[0]);
- });
-
- s.test("JsonLayout with boolean type message test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug(false);
- t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/, t.appender.logMessages[0]);
- });
-
- s.test("JsonLayout with quote test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug("TE\"S\"T");
- t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/, t.appender.logMessages[0]);
- });
-
- s.test("JsonLayout with exception test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug("TEST", new Error("Test error"));
- t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/, t.appender.logMessages[0]);
- });
+ s.test("JsonLayout test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug("TEST");
+ t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/, t.appender.logMessages[0]);
+ });
+
+ s.test("JsonLayout JSON validity test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug("TEST");
+ eval("var o = " + t.appender.logMessages[0]);
+ t.assertEquals(o.message, "TEST");
+ });
+
+ s.test("JsonLayout with number type message test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug(15);
+ t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/, t.appender.logMessages[0]);
+ });
+
+ s.test("JsonLayout with object type message test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug({});
+ t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/, t.appender.logMessages[0]);
+ });
+
+ s.test("JsonLayout with boolean type message test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug(false);
+ t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/, t.appender.logMessages[0]);
+ });
+
+ s.test("JsonLayout with quote test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug("TE\"S\"T");
+ t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/, t.appender.logMessages[0]);
+ });
+
+ s.test("JsonLayout with exception test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug("TEST", new Error("Test error"));
+ t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/, t.appender.logMessages[0]);
+ });
var setUpJsonLayoutMillisecondsTest = function(t) {
t.date = new Date();
t.timeInMilliseconds = t.date.getTime();
t.timeInSeconds = Math.floor(t.timeInMilliseconds / 1000);
t.milliseconds = t.date.getMilliseconds();
-
+
t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);
t.layout = new log4javascript.JsonLayout();
};
@@ -469,52 +469,52 @@ xn.test.suite("log4javascript tests", function(s) {
setUpJsonLayoutMillisecondsTest(t);
// Test default (i.e. timestamps in milliseconds) first
- var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInMilliseconds + ',"level":"DEBUG","url":".*","message":"TEST"}$');
- t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));
+ var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInMilliseconds + ',"level":"DEBUG","url":".*","message":"TEST"}$');
+ t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));
});
-
+
s.test("JsonLayout seconds/milliseconds test 2", function(t) {
setUpJsonLayoutMillisecondsTest(t);
- // Change the global setting
- log4javascript.setTimeStampsInMilliseconds(false);
- var formatted = t.layout.format(t.loggingEvent);
- log4javascript.setTimeStampsInMilliseconds(true);
- var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');
- t.assertRegexMatches(regex, formatted);
+ // Change the global setting
+ log4javascript.setTimeStampsInMilliseconds(false);
+ var formatted = t.layout.format(t.loggingEvent);
+ log4javascript.setTimeStampsInMilliseconds(true);
+ var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');
+ t.assertRegexMatches(regex, formatted);
});
s.test("JsonLayout seconds/milliseconds test 3", function(t) {
setUpJsonLayoutMillisecondsTest(t);
- // Change the layout setting
- t.layout.setTimeStampsInMilliseconds(false);
- var formatted = t.layout.format(t.loggingEvent);
- var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');
- t.assertRegexMatches(regex, formatted);
+ // Change the layout setting
+ t.layout.setTimeStampsInMilliseconds(false);
+ var formatted = t.layout.format(t.loggingEvent);
+ var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');
+ t.assertRegexMatches(regex, formatted);
});
s.test("HttpPostDataLayout format test", function(t) {
var layout = new log4javascript.HttpPostDataLayout();
testLayoutWithVariables(layout, t);
});
- s.test("HttpPostDataLayout test", function(t) {
- t.appender.setLayout(new log4javascript.HttpPostDataLayout());
- t.logger.debug("TEST");
- t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST$/, t.appender.logMessages[0]);
- });
+ s.test("HttpPostDataLayout test", function(t) {
+ t.appender.setLayout(new log4javascript.HttpPostDataLayout());
+ t.logger.debug("TEST");
+ t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST$/, t.appender.logMessages[0]);
+ });
- s.test("HttpPostDataLayout URL encoding test", function(t) {
- t.appender.setLayout(new log4javascript.HttpPostDataLayout());
- t.logger.debug("TEST +\"1\"");
- t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/, t.appender.logMessages[0]);
- });
+ s.test("HttpPostDataLayout URL encoding test", function(t) {
+ t.appender.setLayout(new log4javascript.HttpPostDataLayout());
+ t.logger.debug("TEST +\"1\"");
+ t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/, t.appender.logMessages[0]);
+ });
- s.test("HttpPostDataLayout with exception test", function(t) {
- t.appender.setLayout(new log4javascript.HttpPostDataLayout());
- t.logger.debug("TEST", new Error("Test error"));
- t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/, t.appender.logMessages[0]);
- });
+ s.test("HttpPostDataLayout with exception test", function(t) {
+ t.appender.setLayout(new log4javascript.HttpPostDataLayout());
+ t.logger.debug("TEST", new Error("Test error"));
+ t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/, t.appender.logMessages[0]);
+ });
(function() {
var formatObjectExpansion = log4javascript.evalInScope("formatObjectExpansion");
@@ -553,11 +553,11 @@ xn.test.suite("log4javascript tests", function(s) {
" 1.2," + newLine +
" A string," + newLine +
" [" + newLine +
- " 1," + newLine +
- " test" + newLine +
+ " 1," + newLine +
+ " test" + newLine +
" ]," + newLine +
" {" + newLine +
- " a: [object Object]" + newLine +
+ " a: [object Object]" + newLine +
" }" + newLine +
"]"
);
@@ -567,7 +567,7 @@ xn.test.suite("log4javascript tests", function(s) {
var obj = {
STRING: "A string"
};
- t.assertEquals(formatObjectExpansion(obj, 1),
+ t.assertEquals(formatObjectExpansion(obj, 1),
"{" + newLine +
" STRING: A string" + newLine +
"}"
@@ -577,69 +577,69 @@ xn.test.suite("log4javascript tests", function(s) {
s.test("formatObjectExpansion simple circular object test", function(t) {
var obj = {};
obj.a = obj;
-
- t.assertEquals(formatObjectExpansion(obj, 2),
+
+ t.assertEquals(formatObjectExpansion(obj, 2),
"{" + newLine +
" a: [object Object] [already expanded]" + newLine +
"}"
);
});
- })(); /* ---------------------------------------------------------- */
-
- var getSampleDate = function() {
- var date = new Date();
- date.setFullYear(2006);
- date.setMonth(7);
- date.setDate(30);
- date.setHours(15);
- date.setMinutes(38);
- date.setSeconds(45);
- return date;
- };
+ })(); /* ---------------------------------------------------------- */
+
+ var getSampleDate = function() {
+ var date = new Date();
+ date.setFullYear(2006);
+ date.setMonth(7);
+ date.setDate(30);
+ date.setHours(15);
+ date.setMinutes(38);
+ date.setSeconds(45);
+ return date;
+ };
- /* ---------------------------------------------------------- */
+ /* ---------------------------------------------------------- */
- s.test("String.replace test", function(t) {
- t.assertEquals("Hello world".replace(/o/g, "Z"), "HellZ wZrld");
- });
+ s.test("String.replace test", function(t) {
+ t.assertEquals("Hello world".replace(/o/g, "Z"), "HellZ wZrld");
+ });
s.test("PatternLayout format test", function(t) {
var layout = new log4javascript.PatternLayout();
testLayoutWithVariables(layout, t);
});
- s.test("PatternLayout dates test", function(t) {
- var layout = new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");
- t.appender.setLayout(layout);
- t.logger.debug("TEST");
- t.assertRegexMatches(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2},\d{3} \d{2}:\d{2}$/, t.appender.logMessages[0]);
- });
-
- s.test("PatternLayout modifiers test", function(t) {
- var layout = new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");
- t.appender.setLayout(layout);
- t.logger.debug("TEST");
- t.assertEquals(t.appender.logMessages[0], "TEST|TEST|TEST| TEST|TEST |ST|ST| TEST|ST|TEST |");
- });
-
- s.test("PatternLayout conversion characters test", function(t) {
- var layout = new log4javascript.PatternLayout("%c %n %p %r literal %%");
- t.appender.setLayout(layout);
- t.logger.debug("TEST");
- t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/, t.appender.logMessages[0]);
- });
-
- s.test("PatternLayout message test", function(t) {
- var layout = new log4javascript.PatternLayout("%m{1} %m{2}");
- t.appender.setLayout(layout);
- var testObj = {
- strikers: {
- quick: "Marlon"
- }
- };
- t.logger.debug(testObj);
- t.assertEquals("{\r\n strikers: [object Object]\r\n} {\r\n\ strikers: {\r\n quick: Marlon\r\n }\r\n}", t.appender.logMessages[0]);
- });
+ s.test("PatternLayout dates test", function(t) {
+ var layout = new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");
+ t.appender.setLayout(layout);
+ t.logger.debug("TEST");
+ t.assertRegexMatches(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2},\d{3} \d{2}:\d{2}$/, t.appender.logMessages[0]);
+ });
+
+ s.test("PatternLayout modifiers test", function(t) {
+ var layout = new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");
+ t.appender.setLayout(layout);
+ t.logger.debug("TEST");
+ t.assertEquals(t.appender.logMessages[0], "TEST|TEST|TEST| TEST|TEST |ST|ST| TEST|ST|TEST |");
+ });
+
+ s.test("PatternLayout conversion characters test", function(t) {
+ var layout = new log4javascript.PatternLayout("%c %n %p %r literal %%");
+ t.appender.setLayout(layout);
+ t.logger.debug("TEST");
+ t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/, t.appender.logMessages[0]);
+ });
+
+ s.test("PatternLayout message test", function(t) {
+ var layout = new log4javascript.PatternLayout("%m{1} %m{2}");
+ t.appender.setLayout(layout);
+ var testObj = {
+ strikers: {
+ quick: "Marlon"
+ }
+ };
+ t.logger.debug(testObj);
+ t.assertEquals("{\r\n strikers: [object Object]\r\n} {\r\n\ strikers: {\r\n quick: Marlon\r\n }\r\n}", t.appender.logMessages[0]);
+ });
/*
s.test("AjaxAppender JsonLayout single message test", function(t) {
t.async(10000);
diff --git a/js/tests/log4javascript_uncompressed.js b/js/tests/log4javascript_uncompressed.js
index 2fd9d27..e136dac 100644
--- a/js/tests/log4javascript_uncompressed.js
+++ b/js/tests/log4javascript_uncompressed.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -134,25 +134,25 @@ xn.test.suite("log4javascript tests", function(s) {
return "[ArrayAppender]";
};
- s.setUp = function(t) {
- t.logger = log4javascript.getLogger("test");
+ s.setUp = function(t) {
+ t.logger = log4javascript.getLogger("test");
t.logger.removeAllAppenders();
t.appender = new ArrayAppender();
- t.logger.addAppender(t.appender);
- };
+ t.logger.addAppender(t.appender);
+ };
- s.tearDown = function(t) {
- t.logger.removeAppender(t.appender);
+ s.tearDown = function(t) {
+ t.logger.removeAppender(t.appender);
log4javascript.resetConfiguration();
};
- s.test("Stub script interface test", function(t) {
- try {
- compareObjectInterface(log4javascript, "log4javascript", log4javascript_stub, "log4javascript_stub");
- } catch (ex) {
- t.fail(ex);
- }
- });
+ s.test("Stub script interface test", function(t) {
+ try {
+ compareObjectInterface(log4javascript, "log4javascript", log4javascript_stub, "log4javascript_stub");
+ } catch (ex) {
+ t.fail(ex);
+ }
+ });
s.test("Disable log4javascript test", function(t) {
log4javascript.setEnabled(false);
@@ -161,26 +161,26 @@ xn.test.suite("log4javascript tests", function(s) {
log4javascript.setEnabled(true);
});
- s.test("Array.splice test 1", function(t) {
- var a = ["Marlon", "Ashley", "Darius", "Lloyd"];
- var deletedItems = a.splice(1, 2);
- t.assertEquals(a.join(","), "Marlon,Lloyd");
- t.assertEquals(deletedItems.join(","), "Ashley,Darius");
- });
+ s.test("Array.splice test 1", function(t) {
+ var a = ["Marlon", "Ashley", "Darius", "Lloyd"];
+ var deletedItems = a.splice(1, 2);
+ t.assertEquals(a.join(","), "Marlon,Lloyd");
+ t.assertEquals(deletedItems.join(","), "Ashley,Darius");
+ });
- s.test("Array.splice test 2", function(t) {
- var a = ["Marlon", "Ashley", "Darius", "Lloyd"];
- var deletedItems = a.splice(1, 1, "Malky", "Jay");
- t.assertEquals(a.join(","), "Marlon,Malky,Jay,Darius,Lloyd");
- t.assertEquals(deletedItems.join(","), "Ashley");
- });
+ s.test("Array.splice test 2", function(t) {
+ var a = ["Marlon", "Ashley", "Darius", "Lloyd"];
+ var deletedItems = a.splice(1, 1, "Malky", "Jay");
+ t.assertEquals(a.join(","), "Marlon,Malky,Jay,Darius,Lloyd");
+ t.assertEquals(deletedItems.join(","), "Ashley");
+ });
- s.test("array_remove test", function(t) {
- var array_remove = log4javascript.evalInScope("array_remove");
- var a = ["Marlon", "Ashley", "Darius"];
- array_remove(a, "Darius");
- t.assertEquals(a.join(","), "Marlon,Ashley");
- });
+ s.test("array_remove test", function(t) {
+ var array_remove = log4javascript.evalInScope("array_remove");
+ var a = ["Marlon", "Ashley", "Darius"];
+ array_remove(a, "Darius");
+ t.assertEquals(a.join(","), "Marlon,Ashley");
+ });
s.test("array_remove with empty array test", function(t) {
var array_remove = log4javascript.evalInScope("array_remove");
@@ -189,20 +189,20 @@ xn.test.suite("log4javascript tests", function(s) {
t.assertEquals(a.join(","), "");
});
- s.test("Logger logging test", function(t) {
- // Should log since the default level for loggers is DEBUG and
- // the default threshold for appenders is ALL
- t.logger.debug("TEST");
- t.assertEquals(t.appender.logMessages.length, 1);
- });
+ s.test("Logger logging test", function(t) {
+ // Should log since the default level for loggers is DEBUG and
+ // the default threshold for appenders is ALL
+ t.logger.debug("TEST");
+ t.assertEquals(t.appender.logMessages.length, 1);
+ });
- s.test("Logger levels test", function(t) {
- var originalLevel = t.logger.getEffectiveLevel();
- t.logger.setLevel(log4javascript.Level.INFO);
- t.logger.debug("TEST");
+ s.test("Logger levels test", function(t) {
+ var originalLevel = t.logger.getEffectiveLevel();
+ t.logger.setLevel(log4javascript.Level.INFO);
+ t.logger.debug("TEST");
t.logger.setLevel(originalLevel);
- t.assertEquals(t.appender.logMessages.length, 0);
- });
+ t.assertEquals(t.appender.logMessages.length, 0);
+ });
s.test("Logger getEffectiveLevel inheritance test 1", function(t) {
var parentLogger = log4javascript.getLogger("test1");
@@ -296,22 +296,22 @@ xn.test.suite("log4javascript tests", function(s) {
});
s.test("Appender threshold test", function(t) {
- t.appender.setThreshold(log4javascript.Level.INFO);
- t.logger.debug("TEST");
- t.assertEquals(t.appender.logMessages.length, 0);
- });
+ t.appender.setThreshold(log4javascript.Level.INFO);
+ t.logger.debug("TEST");
+ t.assertEquals(t.appender.logMessages.length, 0);
+ });
- s.test("Basic appender / layout test", function(t) {
- t.logger.debug("TEST");
+ s.test("Basic appender / layout test", function(t) {
+ t.logger.debug("TEST");
t.assertEquals(t.appender.logMessages[0], "TEST");
- });
+ });
s.test("Appender uniqueness within logger test", function(t) {
// Add the same appender to the logger for a second time
t.logger.addAppender(t.appender);
- t.logger.debug("TEST");
- t.assertEquals(t.appender.logMessages.length, 1);
- });
+ t.logger.debug("TEST");
+ t.assertEquals(t.appender.logMessages.length, 1);
+ });
s.test("Logger remove appender test", function(t) {
t.logger.debug("TEST");
@@ -331,44 +331,44 @@ xn.test.suite("log4javascript tests", function(s) {
testLayoutWithVariables(layout, t);
});
- s.test("SimpleLayout test", function(t) {
- t.appender.setLayout(new log4javascript.SimpleLayout());
- t.logger.debug("TEST");
- t.assertEquals(t.appender.logMessages[0], "DEBUG - TEST");
- });
+ s.test("SimpleLayout test", function(t) {
+ t.appender.setLayout(new log4javascript.SimpleLayout());
+ t.logger.debug("TEST");
+ t.assertEquals(t.appender.logMessages[0], "DEBUG - TEST");
+ });
s.test("NullLayout format test", function(t) {
var layout = new log4javascript.NullLayout();
testLayoutWithVariables(layout, t);
});
- s.test("NullLayout test", function(t) {
- t.appender.setLayout(new log4javascript.NullLayout());
- t.logger.debug("TEST");
- t.assertEquals(t.appender.logMessages[0], "TEST");
- });
+ s.test("NullLayout test", function(t) {
+ t.appender.setLayout(new log4javascript.NullLayout());
+ t.logger.debug("TEST");
+ t.assertEquals(t.appender.logMessages[0], "TEST");
+ });
s.test("XmlLayout format test", function(t) {
var layout = new log4javascript.XmlLayout();
testLayoutWithVariables(layout, t);
});
- s.test("XmlLayout test", function(t) {
- t.appender.setLayout(new log4javascript.XmlLayout());
- t.logger.debug("TEST");
- t.assertRegexMatches(/^\s*<\/log4javascript:message>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);
- });
+ s.test("XmlLayout test", function(t) {
+ t.appender.setLayout(new log4javascript.XmlLayout());
+ t.logger.debug("TEST");
+ t.assertRegexMatches(/^\s*<\/log4javascript:message>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);
+ });
- s.test("XmlLayout with exception test", function(t) {
- t.appender.setLayout(new log4javascript.XmlLayout());
- t.logger.debug("TEST", new Error("Test error"));
- t.assertRegexMatches(/^\s*<\/log4javascript:message>\s*\s*<\/log4javascript:exception>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);
- });
+ s.test("XmlLayout with exception test", function(t) {
+ t.appender.setLayout(new log4javascript.XmlLayout());
+ t.logger.debug("TEST", new Error("Test error"));
+ t.assertRegexMatches(/^\s*<\/log4javascript:message>\s*\s*<\/log4javascript:exception>\s*<\/log4javascript:event>\s*$/, t.appender.logMessages[0]);
+ });
var setUpXmlLayoutMillisecondsTest = function(t) {
t.date = new Date();
t.timeInMilliseconds = t.date.getTime();
t.timeInSeconds = Math.floor(t.timeInMilliseconds / 1000);
t.milliseconds = t.date.getMilliseconds();
-
+
t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);
t.layout = new log4javascript.XmlLayout();
}
@@ -377,29 +377,29 @@ xn.test.suite("log4javascript tests", function(s) {
setUpXmlLayoutMillisecondsTest(t);
// Test default (i.e. timestamps in milliseconds) first
- var regex = new RegExp('^\\s*\\s*\\s*$');
- t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));
+ var regex = new RegExp('^\\s*\\s*\\s*$');
+ t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));
});
-
+
s.test("XmlLayout seconds/milliseconds test 2", function(t) {
setUpXmlLayoutMillisecondsTest(t);
- // Change the global setting
- log4javascript.setTimeStampsInMilliseconds(false);
- var formatted = t.layout.format(t.loggingEvent);
- log4javascript.setTimeStampsInMilliseconds(true);
- var regex = new RegExp('^\\s*\\s*\\s*$');
- t.assertRegexMatches(regex, formatted);
+ // Change the global setting
+ log4javascript.setTimeStampsInMilliseconds(false);
+ var formatted = t.layout.format(t.loggingEvent);
+ log4javascript.setTimeStampsInMilliseconds(true);
+ var regex = new RegExp('^\\s*\\s*\\s*$');
+ t.assertRegexMatches(regex, formatted);
});
s.test("XmlLayout seconds/milliseconds test 3", function(t) {
setUpXmlLayoutMillisecondsTest(t);
- // Change the layout setting
- t.layout.setTimeStampsInMilliseconds(false);
- var formatted = t.layout.format(t.loggingEvent);
- var regex = new RegExp('^\\s*\\s*\\s*$');
- t.assertRegexMatches(regex, formatted);
+ // Change the layout setting
+ t.layout.setTimeStampsInMilliseconds(false);
+ var formatted = t.layout.format(t.loggingEvent);
+ var regex = new RegExp('^\\s*\\s*\\s*$');
+ t.assertRegexMatches(regex, formatted);
});
s.test("escapeNewLines test", function(t) {
var escapeNewLines = log4javascript.evalInScope("escapeNewLines");
@@ -412,55 +412,55 @@ xn.test.suite("log4javascript tests", function(s) {
testLayoutWithVariables(layout, t);
});
- s.test("JsonLayout test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug("TEST");
- t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/, t.appender.logMessages[0]);
- });
-
- s.test("JsonLayout JSON validity test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug("TEST");
- eval("var o = " + t.appender.logMessages[0]);
- t.assertEquals(o.message, "TEST");
- });
-
- s.test("JsonLayout with number type message test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug(15);
- t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/, t.appender.logMessages[0]);
- });
-
- s.test("JsonLayout with object type message test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug({});
- t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/, t.appender.logMessages[0]);
- });
-
- s.test("JsonLayout with boolean type message test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug(false);
- t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/, t.appender.logMessages[0]);
- });
-
- s.test("JsonLayout with quote test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug("TE\"S\"T");
- t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/, t.appender.logMessages[0]);
- });
-
- s.test("JsonLayout with exception test", function(t) {
- t.appender.setLayout(new log4javascript.JsonLayout());
- t.logger.debug("TEST", new Error("Test error"));
- t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/, t.appender.logMessages[0]);
- });
+ s.test("JsonLayout test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug("TEST");
+ t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST"}$/, t.appender.logMessages[0]);
+ });
+
+ s.test("JsonLayout JSON validity test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug("TEST");
+ eval("var o = " + t.appender.logMessages[0]);
+ t.assertEquals(o.message, "TEST");
+ });
+
+ s.test("JsonLayout with number type message test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug(15);
+ t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":15}$/, t.appender.logMessages[0]);
+ });
+
+ s.test("JsonLayout with object type message test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug({});
+ t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"\[object Object\]"}$/, t.appender.logMessages[0]);
+ });
+
+ s.test("JsonLayout with boolean type message test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug(false);
+ t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":false}$/, t.appender.logMessages[0]);
+ });
+
+ s.test("JsonLayout with quote test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug("TE\"S\"T");
+ t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TE\\"S\\"T"}$/, t.appender.logMessages[0]);
+ });
+
+ s.test("JsonLayout with exception test", function(t) {
+ t.appender.setLayout(new log4javascript.JsonLayout());
+ t.logger.debug("TEST", new Error("Test error"));
+ t.assertRegexMatches(/^{"logger":"test","timestamp":\d+,"level":"DEBUG","url":".*","message":"TEST","exception":.*}$/, t.appender.logMessages[0]);
+ });
var setUpJsonLayoutMillisecondsTest = function(t) {
t.date = new Date();
t.timeInMilliseconds = t.date.getTime();
t.timeInSeconds = Math.floor(t.timeInMilliseconds / 1000);
t.milliseconds = t.date.getMilliseconds();
-
+
t.loggingEvent = new log4javascript.LoggingEvent(t.logger, t.date, log4javascript.Level.DEBUG, ["TEST"], null);
t.layout = new log4javascript.JsonLayout();
};
@@ -469,52 +469,52 @@ xn.test.suite("log4javascript tests", function(s) {
setUpJsonLayoutMillisecondsTest(t);
// Test default (i.e. timestamps in milliseconds) first
- var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInMilliseconds + ',"level":"DEBUG","url":".*","message":"TEST"}$');
- t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));
+ var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInMilliseconds + ',"level":"DEBUG","url":".*","message":"TEST"}$');
+ t.assertRegexMatches(regex, t.layout.format(t.loggingEvent));
});
-
+
s.test("JsonLayout seconds/milliseconds test 2", function(t) {
setUpJsonLayoutMillisecondsTest(t);
- // Change the global setting
- log4javascript.setTimeStampsInMilliseconds(false);
- var formatted = t.layout.format(t.loggingEvent);
- log4javascript.setTimeStampsInMilliseconds(true);
- var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');
- t.assertRegexMatches(regex, formatted);
+ // Change the global setting
+ log4javascript.setTimeStampsInMilliseconds(false);
+ var formatted = t.layout.format(t.loggingEvent);
+ log4javascript.setTimeStampsInMilliseconds(true);
+ var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');
+ t.assertRegexMatches(regex, formatted);
});
s.test("JsonLayout seconds/milliseconds test 3", function(t) {
setUpJsonLayoutMillisecondsTest(t);
- // Change the layout setting
- t.layout.setTimeStampsInMilliseconds(false);
- var formatted = t.layout.format(t.loggingEvent);
- var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');
- t.assertRegexMatches(regex, formatted);
+ // Change the layout setting
+ t.layout.setTimeStampsInMilliseconds(false);
+ var formatted = t.layout.format(t.loggingEvent);
+ var regex = new RegExp('^{"logger":"test","timestamp":' + t.timeInSeconds + ',"level":"DEBUG","url":".*","message":"TEST","milliseconds":' + t.milliseconds + '}$');
+ t.assertRegexMatches(regex, formatted);
});
s.test("HttpPostDataLayout format test", function(t) {
var layout = new log4javascript.HttpPostDataLayout();
testLayoutWithVariables(layout, t);
});
- s.test("HttpPostDataLayout test", function(t) {
- t.appender.setLayout(new log4javascript.HttpPostDataLayout());
- t.logger.debug("TEST");
- t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST$/, t.appender.logMessages[0]);
- });
+ s.test("HttpPostDataLayout test", function(t) {
+ t.appender.setLayout(new log4javascript.HttpPostDataLayout());
+ t.logger.debug("TEST");
+ t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST$/, t.appender.logMessages[0]);
+ });
- s.test("HttpPostDataLayout URL encoding test", function(t) {
- t.appender.setLayout(new log4javascript.HttpPostDataLayout());
- t.logger.debug("TEST +\"1\"");
- t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/, t.appender.logMessages[0]);
- });
+ s.test("HttpPostDataLayout URL encoding test", function(t) {
+ t.appender.setLayout(new log4javascript.HttpPostDataLayout());
+ t.logger.debug("TEST +\"1\"");
+ t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST%20%2B%221%22$/, t.appender.logMessages[0]);
+ });
- s.test("HttpPostDataLayout with exception test", function(t) {
- t.appender.setLayout(new log4javascript.HttpPostDataLayout());
- t.logger.debug("TEST", new Error("Test error"));
- t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/, t.appender.logMessages[0]);
- });
+ s.test("HttpPostDataLayout with exception test", function(t) {
+ t.appender.setLayout(new log4javascript.HttpPostDataLayout());
+ t.logger.debug("TEST", new Error("Test error"));
+ t.assertRegexMatches(/^logger=test×tamp=\d+&level=DEBUG&url=.*&message=TEST&exception=.*$/, t.appender.logMessages[0]);
+ });
(function() {
var formatObjectExpansion = log4javascript.evalInScope("formatObjectExpansion");
@@ -553,11 +553,11 @@ xn.test.suite("log4javascript tests", function(s) {
" 1.2," + newLine +
" A string," + newLine +
" [" + newLine +
- " 1," + newLine +
- " test" + newLine +
+ " 1," + newLine +
+ " test" + newLine +
" ]," + newLine +
" {" + newLine +
- " a: [object Object]" + newLine +
+ " a: [object Object]" + newLine +
" }" + newLine +
"]"
);
@@ -567,7 +567,7 @@ xn.test.suite("log4javascript tests", function(s) {
var obj = {
STRING: "A string"
};
- t.assertEquals(formatObjectExpansion(obj, 1),
+ t.assertEquals(formatObjectExpansion(obj, 1),
"{" + newLine +
" STRING: A string" + newLine +
"}"
@@ -577,69 +577,69 @@ xn.test.suite("log4javascript tests", function(s) {
s.test("formatObjectExpansion simple circular object test", function(t) {
var obj = {};
obj.a = obj;
-
- t.assertEquals(formatObjectExpansion(obj, 2),
+
+ t.assertEquals(formatObjectExpansion(obj, 2),
"{" + newLine +
" a: [object Object] [already expanded]" + newLine +
"}"
);
});
- })(); /* ---------------------------------------------------------- */
-
- var getSampleDate = function() {
- var date = new Date();
- date.setFullYear(2006);
- date.setMonth(7);
- date.setDate(30);
- date.setHours(15);
- date.setMinutes(38);
- date.setSeconds(45);
- return date;
- };
+ })(); /* ---------------------------------------------------------- */
+
+ var getSampleDate = function() {
+ var date = new Date();
+ date.setFullYear(2006);
+ date.setMonth(7);
+ date.setDate(30);
+ date.setHours(15);
+ date.setMinutes(38);
+ date.setSeconds(45);
+ return date;
+ };
- /* ---------------------------------------------------------- */
+ /* ---------------------------------------------------------- */
- s.test("String.replace test", function(t) {
- t.assertEquals("Hello world".replace(/o/g, "Z"), "HellZ wZrld");
- });
+ s.test("String.replace test", function(t) {
+ t.assertEquals("Hello world".replace(/o/g, "Z"), "HellZ wZrld");
+ });
s.test("PatternLayout format test", function(t) {
var layout = new log4javascript.PatternLayout();
testLayoutWithVariables(layout, t);
});
- s.test("PatternLayout dates test", function(t) {
- var layout = new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");
- t.appender.setLayout(layout);
- t.logger.debug("TEST");
- t.assertRegexMatches(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2},\d{3} \d{2}:\d{2}$/, t.appender.logMessages[0]);
- });
-
- s.test("PatternLayout modifiers test", function(t) {
- var layout = new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");
- t.appender.setLayout(layout);
- t.logger.debug("TEST");
- t.assertEquals(t.appender.logMessages[0], "TEST|TEST|TEST| TEST|TEST |ST|ST| TEST|ST|TEST |");
- });
-
- s.test("PatternLayout conversion characters test", function(t) {
- var layout = new log4javascript.PatternLayout("%c %n %p %r literal %%");
- t.appender.setLayout(layout);
- t.logger.debug("TEST");
- t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/, t.appender.logMessages[0]);
- });
-
- s.test("PatternLayout message test", function(t) {
- var layout = new log4javascript.PatternLayout("%m{1} %m{2}");
- t.appender.setLayout(layout);
- var testObj = {
- strikers: {
- quick: "Marlon"
- }
- };
- t.logger.debug(testObj);
- t.assertEquals("{\r\n strikers: [object Object]\r\n} {\r\n\ strikers: {\r\n quick: Marlon\r\n }\r\n}", t.appender.logMessages[0]);
- });
+ s.test("PatternLayout dates test", function(t) {
+ var layout = new log4javascript.PatternLayout("%d %d{DATE} %d{HH:ss}");
+ t.appender.setLayout(layout);
+ t.logger.debug("TEST");
+ t.assertRegexMatches(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \d{2} [A-Z][a-z]{2} \d{4} \d{2}:\d{2}:\d{2},\d{3} \d{2}:\d{2}$/, t.appender.logMessages[0]);
+ });
+
+ s.test("PatternLayout modifiers test", function(t) {
+ var layout = new log4javascript.PatternLayout("%m|%3m|%-3m|%6m|%-6m|%.2m|%1.2m|%6.8m|%-1.2m|%-6.8m|");
+ t.appender.setLayout(layout);
+ t.logger.debug("TEST");
+ t.assertEquals(t.appender.logMessages[0], "TEST|TEST|TEST| TEST|TEST |ST|ST| TEST|ST|TEST |");
+ });
+
+ s.test("PatternLayout conversion characters test", function(t) {
+ var layout = new log4javascript.PatternLayout("%c %n %p %r literal %%");
+ t.appender.setLayout(layout);
+ t.logger.debug("TEST");
+ t.assertRegexMatches(/^test \s+ DEBUG \d+ literal %$/, t.appender.logMessages[0]);
+ });
+
+ s.test("PatternLayout message test", function(t) {
+ var layout = new log4javascript.PatternLayout("%m{1} %m{2}");
+ t.appender.setLayout(layout);
+ var testObj = {
+ strikers: {
+ quick: "Marlon"
+ }
+ };
+ t.logger.debug(testObj);
+ t.assertEquals("{\r\n strikers: [object Object]\r\n} {\r\n\ strikers: {\r\n quick: Marlon\r\n }\r\n}", t.appender.logMessages[0]);
+ });
// Tests for exceptions when logging
s.test("Logging/grouping test", function(t) {
var browserConsoleAppender = new log4javascript.BrowserConsoleAppender();
@@ -652,19 +652,19 @@ xn.test.suite("log4javascript tests", function(s) {
t.logger.warn("TEST WARN");
t.logger.error("TEST ERROR");
t.logger.fatal("TEST FATAL");
-
+
// Test with exception
t.logger.fatal("TEST FATAL", new Error("Fake error"));
-
+
// Test multiple messages
t.logger.info("TEST INFO", "Second message", ["a", "b", "c"]);
-
+
// Test groups
t.logger.group("TEST GROUP");
t.logger.info("TEST INFO");
t.logger.groupEnd("TEST GROUP");
t.logger.info("TEST INFO");
-
+
t.logger.removeAppender(browserConsoleAppender);
});
@@ -842,8 +842,8 @@ xn.test.suite("log4javascript tests", function(s) {
popUpAppender.setHeight(200);
testConsoleAppender(t, popUpAppender);
-
-
+
+
});
s.test("PopUpAppender with separate console HTML file test", function(t) {
diff --git a/log4javascript.js b/log4javascript.js
index 2b8424e..64201cc 100644
--- a/log4javascript.js
+++ b/log4javascript.js
@@ -1,5 +1,5 @@
/**
- * Copyright 2014 Tim Down.
+ * Copyright 2015 Tim Down.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,20 +15,20 @@
*/
-if(!Array.prototype.push){Array.prototype.push=function(){for(var i=0,len=arguments.length;i0){var firstItem=this[0];for(var i=0,len=this.length-1;i2)?itemsAfterDeleted=argumentsArray.slice(2).concat(itemsAfterDeleted):itemsAfterDeleted;for(i=0,len=itemsToAppend.length;i=0){arr.splice(index,1);return true;}else{return false;}}
function array_contains(arr,val){for(var i=0,len=arr.length;i=level.level;}};Level.ALL=new Level(Number.MIN_VALUE,"ALL");Level.TRACE=new Level(10000,"TRACE");Level.DEBUG=new Level(20000,"DEBUG");Level.INFO=new Level(30000,"INFO");Level.WARN=new Level(40000,"WARN");Level.ERROR=new Level(50000,"ERROR");Level.FATAL=new Level(60000,"FATAL");Level.OFF=new Level(Number.MAX_VALUE,"OFF");log4javascript.Level=Level;function Timer(name,level){this.name=name;this.level=isUndefined(level)?Level.INFO:level;this.start=new Date();}
@@ -72,12 +65,12 @@ var loggingEvent=new LoggingEvent(this,new Date(),level,messages,exception);this
this.name+" is not an instance of log4javascript.Level");}};this.getLevel=function(){return loggerLevel;};this.getEffectiveLevel=function(){for(var logger=this;logger!==null;logger=logger.parent){var level=logger.getLevel();if(level!==null){return level;}}};this.group=function(name,initiallyExpanded){if(enabled){var effectiveAppenders=this.getEffectiveAppenders();for(var i=0,len=effectiveAppenders.length;i0)?args:["Assertion Failure"];args.push(newLine);args.push(expr);this.log(Level.ERROR,args);}};this.toString=function(){return"Logger["+this.name+"]";};}
-Logger.prototype={trace:function(){this.log(Level.TRACE,arguments);},debug:function(){this.log(Level.DEBUG,arguments);},info:function(){this.log(Level.INFO,arguments);},warn:function(){this.log(Level.WARN,arguments);},error:function(){this.log(Level.ERROR,arguments);},fatal:function(){this.log(Level.FATAL,arguments);},isEnabledFor:function(level){return level.isGreaterOrEqual(this.getEffectiveLevel());},isTraceEnabled:function(){return this.isEnabledFor(Level.TRACE);},isDebugEnabled:function(){return this.isEnabledFor(Level.DEBUG);},isInfoEnabled:function(){return this.isEnabledFor(Level.INFO);},isWarnEnabled:function(){return this.isEnabledFor(Level.WARN);},isErrorEnabled:function(){return this.isEnabledFor(Level.ERROR);},isFatalEnabled:function(){return this.isEnabledFor(Level.FATAL);}};Logger.prototype.trace.isEntryPoint=true;Logger.prototype.debug.isEntryPoint=true;Logger.prototype.info.isEntryPoint=true;Logger.prototype.warn.isEntryPoint=true;Logger.prototype.error.isEntryPoint=true;Logger.prototype.fatal.isEntryPoint=true;var loggers={};var loggerNames=[];var ROOT_LOGGER_DEFAULT_LEVEL=Level.DEBUG;var rootLogger=new Logger(rootLoggerName);rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);log4javascript.getRootLogger=function(){return rootLogger;};log4javascript.getLogger=function(loggerName){if(!(typeof loggerName=="string")){loggerName=anonymousLoggerName;logLog.warn("log4javascript.getLogger: non-string logger name "+
+Logger.prototype={trace:function(){this.log(Level.TRACE,arguments);},debug:function(){this.log(Level.DEBUG,arguments);},info:function(){this.log(Level.INFO,arguments);},warn:function(){this.log(Level.WARN,arguments);},error:function(){this.log(Level.ERROR,arguments);},fatal:function(){this.log(Level.FATAL,arguments);},isEnabledFor:function(level){return level.isGreaterOrEqual(this.getEffectiveLevel());},isTraceEnabled:function(){return this.isEnabledFor(Level.TRACE);},isDebugEnabled:function(){return this.isEnabledFor(Level.DEBUG);},isInfoEnabled:function(){return this.isEnabledFor(Level.INFO);},isWarnEnabled:function(){return this.isEnabledFor(Level.WARN);},isErrorEnabled:function(){return this.isEnabledFor(Level.ERROR);},isFatalEnabled:function(){return this.isEnabledFor(Level.FATAL);}};Logger.prototype.trace.isEntryPoint=true;Logger.prototype.debug.isEntryPoint=true;Logger.prototype.info.isEntryPoint=true;Logger.prototype.warn.isEntryPoint=true;Logger.prototype.error.isEntryPoint=true;Logger.prototype.fatal.isEntryPoint=true;var loggers={};var loggerNames=[];var ROOT_LOGGER_DEFAULT_LEVEL=Level.DEBUG;var rootLogger=new Logger(rootLoggerName);rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);log4javascript.getRootLogger=function(){return rootLogger;};log4javascript.getLogger=function(loggerName){if(typeof loggerName!="string"){loggerName=anonymousLoggerName;logLog.warn("log4javascript.getLogger: non-string logger name "+
toStr(loggerName)+" supplied, returning anonymous logger");}
if(loggerName==rootLoggerName){handleError("log4javascript.getLogger: root logger may not be obtained by name");}
if(!loggers[loggerName]){var logger=new Logger(loggerName);loggers[loggerName]=logger;loggerNames.push(loggerName);var lastDotIndex=loggerName.lastIndexOf(".");var parentLogger;if(lastDotIndex>-1){var parentLoggerName=loggerName.substring(0,lastDotIndex);parentLogger=log4javascript.getLogger(parentLoggerName);}else{parentLogger=rootLogger;}
parentLogger.addChild(logger);}
-return loggers[loggerName];};var defaultLogger=null;log4javascript.getDefaultLogger=function(){if(!defaultLogger){defaultLogger=log4javascript.getLogger(defaultLoggerName);var a=new log4javascript.PopUpAppender();defaultLogger.addAppender(a);}
+return loggers[loggerName];};var defaultLogger=null;log4javascript.getDefaultLogger=function(){if(!defaultLogger){defaultLogger=createDefaultLogger();}
return defaultLogger;};var nullLogger=null;log4javascript.getNullLogger=function(){if(!nullLogger){nullLogger=new Logger(nullLoggerName);nullLogger.setLevel(Level.OFF);}
return nullLogger;};log4javascript.resetConfiguration=function(){rootLogger.setLevel(ROOT_LOGGER_DEFAULT_LEVEL);loggers={};};var LoggingEvent=function(logger,timeStamp,level,messages,exception){this.logger=logger;this.timeStamp=timeStamp;this.timeStampInMilliseconds=timeStamp.getTime();this.timeStampInSeconds=Math.floor(this.timeStampInMilliseconds/1000);this.milliseconds=this.timeStamp.getMilliseconds();this.level=level;this.messages=messages;this.exception=exception;};LoggingEvent.prototype={getThrowableStrRep:function(){return this.exception?getExceptionStringRep(this.exception):"";},getCombinedMessages:function(){return(this.messages.length==1)?this.messages[0]:this.messages.join(newLine);},toString:function(){return"LoggingEvent["+this.level+"]";}};log4javascript.LoggingEvent=LoggingEvent;var Layout=function(){};Layout.prototype={defaults:{loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url"},loggerKey:"logger",timeStampKey:"timestamp",millisecondsKey:"milliseconds",levelKey:"level",messageKey:"message",exceptionKey:"exception",urlKey:"url",batchHeader:"",batchFooter:"",batchSeparator:"",returnsPostData:false,overrideTimeStampsSetting:false,useTimeStampsInMilliseconds:null,format:function(){handleError("Layout.format: layout supplied has no format() method");},ignoresThrowable:function(){handleError("Layout.ignoresThrowable: layout supplied has no ignoresThrowable() method");},getContentType:function(){return"text/plain";},allowBatching:function(){return true;},setTimeStampsInMilliseconds:function(timeStampsInMilliseconds){this.overrideTimeStampsSetting=true;this.useTimeStampsInMilliseconds=bool(timeStampsInMilliseconds);},isTimeStampsInMilliseconds:function(){return this.overrideTimeStampsSetting?this.useTimeStampsInMilliseconds:useTimeStampsInMilliseconds;},getTimeStampValue:function(loggingEvent){return this.isTimeStampsInMilliseconds()?loggingEvent.timeStampInMilliseconds:loggingEvent.timeStampInSeconds;},getDataValues:function(loggingEvent,combineMessages){var dataValues=[[this.loggerKey,loggingEvent.logger.name],[this.timeStampKey,this.getTimeStampValue(loggingEvent)],[this.levelKey,loggingEvent.level.name],[this.urlKey,window.location.href],[this.messageKey,combineMessages?loggingEvent.getCombinedMessages():loggingEvent.messages]];if(!this.isTimeStampsInMilliseconds()){dataValues.push([this.millisecondsKey,loggingEvent.milliseconds]);}
if(loggingEvent.exception){dataValues.push([this.exceptionKey,getExceptionStringRep(loggingEvent.exception)]);}
@@ -110,7 +103,7 @@ for(i=0,len=dataValues.length-1;i<=len;i++){str+=this.tab+"\""+dataValues[i][0]+
str+=this.lineBreak;}
str+="}"+this.lineBreak;return str;};JsonLayout.prototype.ignoresThrowable=function(){return false;};JsonLayout.prototype.toString=function(){return"JsonLayout";};JsonLayout.prototype.getContentType=function(){return"application/json";};log4javascript.JsonLayout=JsonLayout;function HttpPostDataLayout(){this.setKeys();this.customFields=[];this.returnsPostData=true;}
HttpPostDataLayout.prototype=new Layout();HttpPostDataLayout.prototype.allowBatching=function(){return false;};HttpPostDataLayout.prototype.format=function(loggingEvent){var dataValues=this.getDataValues(loggingEvent);var queryBits=[];for(var i=0,len=dataValues.length;i=200&&xmlHttp.status<300)||xmlHttp.status==1223;}
function AjaxAppender(url,withCredentials){var appender=this;var isSupported=true;if(!url){handleError("AjaxAppender: URL must be specified in constructor");isSupported=false;}
var timed=this.defaults.timed;var waitForResponse=this.defaults.waitForResponse;var batchSize=this.defaults.batchSize;var timerInterval=this.defaults.timerInterval;var requestSuccessCallback=this.defaults.requestSuccessCallback;var failCallback=this.defaults.failCallback;var postVarName=this.defaults.postVarName;var sendAllOnUnload=this.defaults.sendAllOnUnload;var contentType=this.defaults.contentType;var sessionId=null;var queuedLoggingEvents=[];var queuedRequests=[];var headers=[];var sending=false;var initialized=false;function checkCanConfigure(configOptionName){if(initialized){handleError("AjaxAppender: configuration option '"+
@@ -173,18 +166,18 @@ postData+="layout="+urlEncode(appender.getLayout().toString());}
return postData;}
function scheduleSending(){window.setTimeout(sendAll,timerInterval);}
function xmlHttpErrorHandler(){var msg="AjaxAppender: could not create XMLHttpRequest object. AjaxAppender disabled";handleError(msg);isSupported=false;if(failCallback){failCallback(msg);}}
-function sendRequest(postData,successCallback){try{var xmlHttp=getXmlHttp(xmlHttpErrorHandler);if(isSupported){if(withCredentials&&withCredentialsSupported){xmlHttp.withCredentials=true;}
-xmlHttp.onreadystatechange=function(){if(xmlHttp.readyState==4){if(isHttpRequestSuccessful(xmlHttp)){if(requestSuccessCallback){requestSuccessCallback(xmlHttp);}
+function sendRequest(postData,successCallback){try{var xmlHttp=getXmlHttp(xmlHttpErrorHandler);if(isSupported){xmlHttp.onreadystatechange=function(){if(xmlHttp.readyState==4){if(isHttpRequestSuccessful(xmlHttp)){if(requestSuccessCallback){requestSuccessCallback(xmlHttp);}
if(successCallback){successCallback(xmlHttp);}}else{var msg="AjaxAppender.append: XMLHttpRequest request to URL "+
url+" returned status code "+xmlHttp.status;handleError(msg);if(failCallback){failCallback(msg);}}
-xmlHttp.onreadystatechange=emptyFunction;xmlHttp=null;}};xmlHttp.open("POST",url,true);try{for(var i=0,header;header=headers[i++];){xmlHttp.setRequestHeader(header.name,header.value);}
+xmlHttp.onreadystatechange=emptyFunction;xmlHttp=null;}};xmlHttp.open("POST",url,true);if(withCredentials&&withCredentialsSupported){xmlHttp.withCredentials=true;}
+try{for(var i=0,header;header=headers[i++];){xmlHttp.setRequestHeader(header.name,header.value);}
xmlHttp.setRequestHeader("Content-Type",contentType);}catch(headerEx){var msg="AjaxAppender.append: your browser's XMLHttpRequest implementation"+" does not support setRequestHeader, therefore cannot post data. AjaxAppender disabled";handleError(msg);isSupported=false;if(failCallback){failCallback(msg);}
return;}
xmlHttp.send(postData);}}catch(ex){var errMsg="AjaxAppender.append: error sending log message to "+url;handleError(errMsg,ex);isSupported=false;if(failCallback){failCallback(errMsg+". Details: "+getExceptionStringRep(ex));}}}
this.append=function(loggingEvent){if(isSupported){if(!initialized){init();}
queuedLoggingEvents.push(loggingEvent);var actualBatchSize=this.getLayout().allowBatching()?batchSize:1;if(queuedLoggingEvents.length>=actualBatchSize){var currentLoggingEvent;var batchedLoggingEvents=[];while((currentLoggingEvent=queuedLoggingEvents.shift())){batchedLoggingEvents.push(currentLoggingEvent);}
queuedRequests.push(batchedLoggingEvents);if(!timed&&(!waitForResponse||(waitForResponse&&!sending))){sendAll();}}}};function init(){initialized=true;if(sendAllOnUnload){var oldBeforeUnload=window.onbeforeunload;window.onbeforeunload=function(){if(oldBeforeUnload){oldBeforeUnload();}
-if(sendAllRemaining()){return"Sending log messages";}};}
+sendAllRemaining();};}
if(timed){scheduleSending();}}}
AjaxAppender.prototype=new Appender();AjaxAppender.prototype.defaults={waitForResponse:false,timed:false,timerInterval:1000,batchSize:1,sendAllOnUnload:false,requestSuccessCallback:null,failCallback:null,postVarName:"data",contentType:"application/x-www-form-urlencoded"};AjaxAppender.prototype.layout=new HttpPostDataLayout();AjaxAppender.prototype.toString=function(){return"AjaxAppender";};log4javascript.AjaxAppender=AjaxAppender;function setCookie(name,value,days,path){var expires;path=path?"; path="+path:"";if(days){var date=new Date();date.setTime(date.getTime()+(days*24*60*60*1000));expires="; expires="+date.toGMTString();}else{expires="";}
document.cookie=escape(name)+"="+escape(value)+expires+path;}
@@ -194,12 +187,12 @@ return null;}
function getBaseUrl(){var scripts=document.getElementsByTagName("script");for(var i=0,len=scripts.length;i','','','log4javascript','','','','','','','','','','','
','
','
','Filters:','','','','','','','','
','
',' ','','','','','
','','','','','
','
','
','Options:','','','','','','','','
','
','
','','
','
','','','
','
','','',''];};var defaultCommandLineFunctions=[];ConsoleAppender=function(){};var consoleAppenderIdCounter=1;ConsoleAppender.prototype=new Appender();ConsoleAppender.prototype.create=function(inPage,container,lazyInit,initiallyMinimized,useDocumentWrite,width,height,focusConsoleWindow){var appender=this;var initialized=false;var consoleWindowCreated=false;var consoleWindowLoaded=false;var consoleClosed=false;var queuedLoggingEvents=[];var isSupported=true;var consoleAppenderId=consoleAppenderIdCounter++;initiallyMinimized=extractBooleanFromParam(initiallyMinimized,this.defaults.initiallyMinimized);lazyInit=extractBooleanFromParam(lazyInit,this.defaults.lazyInit);useDocumentWrite=extractBooleanFromParam(useDocumentWrite,this.defaults.useDocumentWrite);var newestMessageAtTop=this.defaults.newestMessageAtTop;var scrollToLatestMessage=this.defaults.scrollToLatestMessage;width=width?width:this.defaults.width;height=height?height:this.defaults.height;var maxMessages=this.defaults.maxMessages;var showCommandLine=this.defaults.showCommandLine;var commandLineObjectExpansionDepth=this.defaults.commandLineObjectExpansionDepth;var showHideButton=this.defaults.showHideButton;var showCloseButton=this.defaults.showCloseButton;var showLogEntryDeleteButtons=this.defaults.showLogEntryDeleteButtons;this.setLayout(this.defaults.layout);var init,createWindow,safeToAppend,getConsoleWindow,open;var appenderName=inPage?"InPageAppender":"PopUpAppender";var checkCanConfigure=function(configOptionName){if(consoleWindowCreated){handleError(appenderName+": configuration option '"+configOptionName+"' may not be set after the appender has been initialized");return false;}
+var ConsoleAppender;(function(){var getConsoleHtmlLines=function(){return['','','','log4javascript','','','','','','','','','','','
','
','
','Filters:','','','','','','','','
','
',' ','','','','','
','','','','','
','
','
','Options:','','','','','','','','
','
','
','','
','
','','','
','
','','',''];};var defaultCommandLineFunctions=[];ConsoleAppender=function(){};var consoleAppenderIdCounter=1;ConsoleAppender.prototype=new Appender();ConsoleAppender.prototype.create=function(inPage,container,lazyInit,initiallyMinimized,useDocumentWrite,width,height,focusConsoleWindow){var appender=this;var initialized=false;var consoleWindowCreated=false;var consoleWindowLoaded=false;var consoleClosed=false;var queuedLoggingEvents=[];var isSupported=true;var consoleAppenderId=consoleAppenderIdCounter++;initiallyMinimized=extractBooleanFromParam(initiallyMinimized,this.defaults.initiallyMinimized);lazyInit=extractBooleanFromParam(lazyInit,this.defaults.lazyInit);useDocumentWrite=extractBooleanFromParam(useDocumentWrite,this.defaults.useDocumentWrite);var newestMessageAtTop=this.defaults.newestMessageAtTop;var scrollToLatestMessage=this.defaults.scrollToLatestMessage;width=width?width:this.defaults.width;height=height?height:this.defaults.height;var maxMessages=this.defaults.maxMessages;var showCommandLine=this.defaults.showCommandLine;var commandLineObjectExpansionDepth=this.defaults.commandLineObjectExpansionDepth;var showHideButton=this.defaults.showHideButton;var showCloseButton=this.defaults.showCloseButton;this.setLayout(this.defaults.layout);var init,createWindow,safeToAppend,getConsoleWindow,open;var appenderName=inPage?"InPageAppender":"PopUpAppender";var checkCanConfigure=function(configOptionName){if(consoleWindowCreated){handleError(appenderName+": configuration option '"+configOptionName+"' may not be set after the appender has been initialized");return false;}
return true;};var consoleWindowExists=function(){return(consoleWindowLoaded&&isSupported&&!consoleClosed);};this.isNewestMessageAtTop=function(){return newestMessageAtTop;};this.setNewestMessageAtTop=function(newestMessageAtTopParam){newestMessageAtTop=bool(newestMessageAtTopParam);if(consoleWindowExists()){getConsoleWindow().setNewestAtTop(newestMessageAtTop);}};this.isScrollToLatestMessage=function(){return scrollToLatestMessage;};this.setScrollToLatestMessage=function(scrollToLatestMessageParam){scrollToLatestMessage=bool(scrollToLatestMessageParam);if(consoleWindowExists()){getConsoleWindow().setScrollToLatest(scrollToLatestMessage);}};this.getWidth=function(){return width;};this.setWidth=function(widthParam){if(checkCanConfigure("width")){width=extractStringFromParam(widthParam,width);}};this.getHeight=function(){return height;};this.setHeight=function(heightParam){if(checkCanConfigure("height")){height=extractStringFromParam(heightParam,height);}};this.getMaxMessages=function(){return maxMessages;};this.setMaxMessages=function(maxMessagesParam){maxMessages=extractIntFromParam(maxMessagesParam,maxMessages);if(consoleWindowExists()){getConsoleWindow().setMaxMessages(maxMessages);}};this.isShowCommandLine=function(){return showCommandLine;};this.setShowCommandLine=function(showCommandLineParam){showCommandLine=bool(showCommandLineParam);if(consoleWindowExists()){getConsoleWindow().setShowCommandLine(showCommandLine);}};this.isShowHideButton=function(){return showHideButton;};this.setShowHideButton=function(showHideButtonParam){showHideButton=bool(showHideButtonParam);if(consoleWindowExists()){getConsoleWindow().setShowHideButton(showHideButton);}};this.isShowCloseButton=function(){return showCloseButton;};this.setShowCloseButton=function(showCloseButtonParam){showCloseButton=bool(showCloseButtonParam);if(consoleWindowExists()){getConsoleWindow().setShowCloseButton(showCloseButton);}};this.getCommandLineObjectExpansionDepth=function(){return commandLineObjectExpansionDepth;};this.setCommandLineObjectExpansionDepth=function(commandLineObjectExpansionDepthParam){commandLineObjectExpansionDepth=extractIntFromParam(commandLineObjectExpansionDepthParam,commandLineObjectExpansionDepth);};var minimized=initiallyMinimized;this.isInitiallyMinimized=function(){return initiallyMinimized;};this.setInitiallyMinimized=function(initiallyMinimizedParam){if(checkCanConfigure("initiallyMinimized")){initiallyMinimized=bool(initiallyMinimizedParam);minimized=initiallyMinimized;}};this.isUseDocumentWrite=function(){return useDocumentWrite;};this.setUseDocumentWrite=function(useDocumentWriteParam){if(checkCanConfigure("useDocumentWrite")){useDocumentWrite=bool(useDocumentWriteParam);}};function QueuedLoggingEvent(loggingEvent,formattedMessage){this.loggingEvent=loggingEvent;this.levelName=loggingEvent.level.name;this.formattedMessage=formattedMessage;}
QueuedLoggingEvent.prototype.append=function(){getConsoleWindow().log(this.levelName,this.formattedMessage);};function QueuedGroup(name,initiallyExpanded){this.name=name;this.initiallyExpanded=initiallyExpanded;}
QueuedGroup.prototype.append=function(){getConsoleWindow().group(this.name,this.initiallyExpanded);};function QueuedGroupEnd(){}
QueuedGroupEnd.prototype.append=function(){getConsoleWindow().groupEnd();};var checkAndAppend=function(){safeToAppend();if(!initialized){init();}else if(consoleClosed&&reopenWhenClosed){createWindow();}
-if(safeToAppend()){appendQueuedLoggingEvents();}};this.append=function(loggingEvent){if(isSupported){var formattedMessage=appender.getLayout().formatWithException(loggingEvent);queuedLoggingEvents.push(new QueuedLoggingEvent(loggingEvent,formattedMessage));checkAndAppend();}};this.group=function(name,initiallyExpanded){if(isSupported){queuedLoggingEvents.push(new QueuedGroup(name,initiallyExpanded));checkAndAppend();}};this.groupEnd=function(){if(isSupported){queuedLoggingEvents.push(new QueuedGroupEnd());checkAndAppend();}};var appendQueuedLoggingEvents=function(){var currentLoggingEvent;while(queuedLoggingEvents.length>0){queuedLoggingEvents.shift().append();}
+if(safeToAppend()){appendQueuedLoggingEvents();}};this.append=function(loggingEvent){if(isSupported){var formattedMessage=appender.getLayout().formatWithException(loggingEvent);queuedLoggingEvents.push(new QueuedLoggingEvent(loggingEvent,formattedMessage));checkAndAppend();}};this.group=function(name,initiallyExpanded){if(isSupported){queuedLoggingEvents.push(new QueuedGroup(name,initiallyExpanded));checkAndAppend();}};this.groupEnd=function(){if(isSupported){queuedLoggingEvents.push(new QueuedGroupEnd());checkAndAppend();}};var appendQueuedLoggingEvents=function(){while(queuedLoggingEvents.length>0){queuedLoggingEvents.shift().append();}
if(focusConsoleWindow){getConsoleWindow().focus();}};this.setAddedToLogger=function(logger){this.loggers.push(logger);if(enabled&&!lazyInit){init();}};this.clear=function(){if(consoleWindowExists()){getConsoleWindow().clearLog();}
queuedLoggingEvents.length=0;};this.focus=function(){if(consoleWindowExists()){getConsoleWindow().focus();}};this.focusCommandLine=function(){if(consoleWindowExists()){getConsoleWindow().focusCommandLine();}};this.focusSearch=function(){if(consoleWindowExists()){getConsoleWindow().focusSearch();}};var commandWindow=window;this.getCommandWindow=function(){return commandWindow;};this.setCommandWindow=function(commandWindowParam){commandWindow=commandWindowParam;};this.executeLastCommand=function(){if(consoleWindowExists()){getConsoleWindow().evalLastCommand();}};var commandLayout=new PatternLayout("%m");this.getCommandLayout=function(){return commandLayout;};this.setCommandLayout=function(commandLayoutParam){commandLayout=commandLayoutParam;};this.evalCommandAndAppend=function(expr){var commandReturnValue={appendResult:true,isError:false};var commandOutput="";try{var result,i;if(!commandWindow.eval&&commandWindow.execScript){commandWindow.execScript("null");}
var commandLineFunctionsHash={};for(i=0,len=commandLineFunctions.length;i]*>","i");if(regex.test(el.outerHTML)){return RegExp.$1.toLowerCase();}}
return"";}
-var lt="<";var gt=">";if(includeRootNode&&rootNode.nodeType!=nodeTypes.DOCUMENT_FRAGMENT_NODE){switch(rootNode.nodeType){case nodeTypes.ELEMENT_NODE:var tagName=rootNode.tagName.toLowerCase();xhtml=startNewLine?newLine+indentation:"";xhtml+=lt;var prefix=getNamespace(rootNode);var hasPrefix=!!prefix;if(hasPrefix){xhtml+=prefix+":";}
+var lt="<";var gt=">";var i,len;if(includeRootNode&&rootNode.nodeType!=nodeTypes.DOCUMENT_FRAGMENT_NODE){switch(rootNode.nodeType){case nodeTypes.ELEMENT_NODE:var tagName=rootNode.tagName.toLowerCase();xhtml=startNewLine?newLine+indentation:"";xhtml+=lt;var prefix=getNamespace(rootNode);var hasPrefix=!!prefix;if(hasPrefix){xhtml+=prefix+":";}
xhtml+=tagName;for(i=0,len=rootNode.attributes.length;i"+newLine;case nodeTypes.DOCUMENT_NODE:xhtml="";for(var i=0,len=rootNode.childNodes.length;i"+newLine;case nodeTypes.DOCUMENT_NODE:xhtml="";for(i=0,len=rootNode.childNodes.length;i
- * Version: 1.4.9
+ * Version: 1.4.13
* Edition: log4javascript
- * Build date: 12 May 2014
+ * Build date: 23 May 2015
* Website: http://log4javascript.org
*/
-/* -------------------------------------------------------------------------- */
-// Array-related stuff
+(function(factory, root) {
+ if (typeof define == "function" && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(factory);
+ } else if (typeof module != "undefined" && typeof exports == "object") {
+ // Node/CommonJS style
+ module.exports = factory();
+ } else {
+ // No AMD or CommonJS support so we place log4javascript in (probably) the global variable
+ root.log4javascript = factory();
+ }
+})(function() {
+ // Array-related stuff. Next three methods are solely for IE5, which is missing them
+ if (!Array.prototype.push) {
+ Array.prototype.push = function() {
+ for (var i = 0, len = arguments.length; i < len; i++){
+ this[this.length] = arguments[i];
+ }
+ return this.length;
+ };
+ }
-// Next three methods are solely for IE5, which is missing them
-if (!Array.prototype.push) {
- Array.prototype.push = function() {
- for (var i = 0, len = arguments.length; i < len; i++){
- this[this.length] = arguments[i];
- }
- return this.length;
- };
-}
-
-if (!Array.prototype.shift) {
- Array.prototype.shift = function() {
- if (this.length > 0) {
- var firstItem = this[0];
- for (var i = 0, len = this.length - 1; i < len; i++) {
- this[i] = this[i + 1];
+ if (!Array.prototype.shift) {
+ Array.prototype.shift = function() {
+ if (this.length > 0) {
+ var firstItem = this[0];
+ for (var i = 0, len = this.length - 1; i < len; i++) {
+ this[i] = this[i + 1];
+ }
+ this.length = this.length - 1;
+ return firstItem;
}
- this.length = this.length - 1;
- return firstItem;
- }
- };
-}
-
-if (!Array.prototype.splice) {
- Array.prototype.splice = function(startIndex, deleteCount) {
- var itemsAfterDeleted = this.slice(startIndex + deleteCount);
- var itemsDeleted = this.slice(startIndex, startIndex + deleteCount);
- this.length = startIndex;
- // Copy the arguments into a proper Array object
- var argumentsArray = [];
- for (var i = 0, len = arguments.length; i < len; i++) {
- argumentsArray[i] = arguments[i];
- }
- var itemsToAppend = (argumentsArray.length > 2) ?
- itemsAfterDeleted = argumentsArray.slice(2).concat(itemsAfterDeleted) : itemsAfterDeleted;
- for (i = 0, len = itemsToAppend.length; i < len; i++) {
- this.push(itemsToAppend[i]);
- }
- return itemsDeleted;
- };
-}
+ };
+ }
-/* -------------------------------------------------------------------------- */
+ if (!Array.prototype.splice) {
+ Array.prototype.splice = function(startIndex, deleteCount) {
+ var itemsAfterDeleted = this.slice(startIndex + deleteCount);
+ var itemsDeleted = this.slice(startIndex, startIndex + deleteCount);
+ this.length = startIndex;
+ // Copy the arguments into a proper Array object
+ var argumentsArray = [];
+ for (var i = 0, len = arguments.length; i < len; i++) {
+ argumentsArray[i] = arguments[i];
+ }
+ var itemsToAppend = (argumentsArray.length > 2) ?
+ itemsAfterDeleted = argumentsArray.slice(2).concat(itemsAfterDeleted) : itemsAfterDeleted;
+ for (i = 0, len = itemsToAppend.length; i < len; i++) {
+ this.push(itemsToAppend[i]);
+ }
+ return itemsDeleted;
+ };
+ }
-var log4javascript = (function() {
+ /* ---------------------------------------------------------------------- */
function isUndefined(obj) {
return typeof obj == "undefined";
@@ -150,8 +157,8 @@ var log4javascript = (function() {
function Log4JavaScript() {}
Log4JavaScript.prototype = new EventSupport();
- log4javascript = new Log4JavaScript();
- log4javascript.version = "1.4.9";
+ var log4javascript = new Log4JavaScript();
+ log4javascript.version = "1.4.13";
log4javascript.edition = "log4javascript";
/* -------------------------------------------------------------------------- */
@@ -220,19 +227,11 @@ var log4javascript = (function() {
var urlEncode = (typeof window.encodeURIComponent != "undefined") ?
function(str) {
return encodeURIComponent(str);
- }:
+ }:
function(str) {
return escape(str).replace(/\+/g, "%2B").replace(/"/g, "%22").replace(/'/g, "%27").replace(/\//g, "%2F").replace(/=/g, "%3D");
};
- var urlDecode = (typeof window.decodeURIComponent != "undefined") ?
- function(str) {
- return decodeURIComponent(str);
- }:
- function(str) {
- return unescape(str).replace(/%2B/g, "+").replace(/%22/g, "\"").replace(/%27/g, "'").replace(/%2F/g, "/").replace(/%3D/g, "=");
- };
-
function array_remove(arr, val) {
var index = -1;
for (var i = 0, len = arr.length; i < len; i++) {
@@ -329,66 +328,6 @@ var log4javascript = (function() {
};
}
- function getListenersPropertyName(eventName) {
- return "__log4javascript_listeners__" + eventName;
- }
-
- function addEvent(node, eventName, listener, useCapture, win) {
- win = win ? win : window;
- if (node.addEventListener) {
- node.addEventListener(eventName, listener, useCapture);
- } else if (node.attachEvent) {
- node.attachEvent("on" + eventName, listener);
- } else {
- var propertyName = getListenersPropertyName(eventName);
- if (!node[propertyName]) {
- node[propertyName] = [];
- // Set event handler
- node["on" + eventName] = function(evt) {
- evt = getEvent(evt, win);
- var listenersPropertyName = getListenersPropertyName(eventName);
-
- // Clone the array of listeners to leave the original untouched
- var listeners = this[listenersPropertyName].concat([]);
- var currentListener;
-
- // Call each listener in turn
- while ((currentListener = listeners.shift())) {
- currentListener.call(this, evt);
- }
- };
- }
- node[propertyName].push(listener);
- }
- }
-
- function removeEvent(node, eventName, listener, useCapture) {
- if (node.removeEventListener) {
- node.removeEventListener(eventName, listener, useCapture);
- } else if (node.detachEvent) {
- node.detachEvent("on" + eventName, listener);
- } else {
- var propertyName = getListenersPropertyName(eventName);
- if (node[propertyName]) {
- array_remove(node[propertyName], listener);
- }
- }
- }
-
- function getEvent(evt, win) {
- win = win ? win : window;
- return evt ? evt : win.event;
- }
-
- function stopEventPropagation(evt) {
- if (evt.stopPropagation) {
- evt.stopPropagation();
- } else if (typeof evt.cancelBubble != "undefined") {
- evt.cancelBubble = true;
- }
- evt.returnValue = false;
- }
-
/* ---------------------------------------------------------------------- */
// Simple logging for log4javascript itself
@@ -465,7 +404,6 @@ var log4javascript = (function() {
log4javascript.isTimeStampsInMilliseconds = function() {
return useTimeStampsInMilliseconds;
};
-
// This evaluates the given expression in the current scope, thus allowing
// scripts to access private variables. Particularly useful for testing
@@ -543,7 +481,7 @@ var log4javascript = (function() {
var appenderCache = null;
var appenderCacheInvalidated = false;
-
+
this.addChild = function(childLogger) {
this.children.push(childLogger);
childLogger.parent = this;
@@ -609,7 +547,7 @@ var log4javascript = (function() {
}
return appenderCache;
};
-
+
this.invalidateAppenderCache = function() {
appenderCacheInvalidated = true;
for (var i = 0, len = this.children.length; i < len; i++) {
@@ -817,7 +755,7 @@ var log4javascript = (function() {
log4javascript.getLogger = function(loggerName) {
// Use default logger if loggerName is not specified or invalid
- if (!(typeof loggerName == "string")) {
+ if (typeof loggerName != "string") {
loggerName = anonymousLoggerName;
logLog.warn("log4javascript.getLogger: non-string logger name " +
toStr(loggerName) + " supplied, returning anonymous logger");
@@ -851,9 +789,7 @@ var log4javascript = (function() {
var defaultLogger = null;
log4javascript.getDefaultLogger = function() {
if (!defaultLogger) {
- defaultLogger = log4javascript.getLogger(defaultLoggerName);
- var a = new log4javascript.PopUpAppender();
- defaultLogger.addAppender(a);
+ defaultLogger = createDefaultLogger();
}
return defaultLogger;
};
@@ -1102,7 +1038,7 @@ var log4javascript = (function() {
log4javascript.Appender = Appender;
/* ---------------------------------------------------------------------- */
- // SimpleLayout
+ // SimpleLayout
function SimpleLayout() {
this.customFields = [];
@@ -1115,16 +1051,16 @@ var log4javascript = (function() {
};
SimpleLayout.prototype.ignoresThrowable = function() {
- return true;
+ return true;
};
SimpleLayout.prototype.toString = function() {
- return "SimpleLayout";
+ return "SimpleLayout";
};
log4javascript.SimpleLayout = SimpleLayout;
/* ----------------------------------------------------------------------- */
- // NullLayout
+ // NullLayout
function NullLayout() {
this.customFields = [];
@@ -1137,7 +1073,7 @@ var log4javascript = (function() {
};
NullLayout.prototype.ignoresThrowable = function() {
- return true;
+ return true;
};
NullLayout.prototype.formatWithException = function(loggingEvent) {
@@ -1146,7 +1082,7 @@ var log4javascript = (function() {
};
NullLayout.prototype.toString = function() {
- return "NullLayout";
+ return "NullLayout";
};
log4javascript.NullLayout = NullLayout;
@@ -1214,11 +1150,11 @@ var log4javascript = (function() {
};
XmlLayout.prototype.ignoresThrowable = function() {
- return false;
+ return false;
};
XmlLayout.prototype.toString = function() {
- return "XmlLayout";
+ return "XmlLayout";
};
log4javascript.XmlLayout = XmlLayout;
@@ -1255,56 +1191,56 @@ var log4javascript = (function() {
return this.combineMessages;
};
- JsonLayout.prototype.format = function(loggingEvent) {
- var layout = this;
- var dataValues = this.getDataValues(loggingEvent, this.combineMessages);
- var str = "{" + this.lineBreak;
- var i, len;
-
- function formatValue(val, prefix, expand) {
- // Check the type of the data value to decide whether quotation marks
- // or expansion are required
- var formattedValue;
- var valType = typeof val;
- if (val instanceof Date) {
- formattedValue = String(val.getTime());
- } else if (expand && (val instanceof Array)) {
- formattedValue = "[" + layout.lineBreak;
- for (var i = 0, len = val.length; i < len; i++) {
- var childPrefix = prefix + layout.tab;
- formattedValue += childPrefix + formatValue(val[i], childPrefix, false);
- if (i < val.length - 1) {
- formattedValue += ",";
- }
- formattedValue += layout.lineBreak;
- }
- formattedValue += prefix + "]";
- } else if (valType !== "number" && valType !== "boolean") {
- formattedValue = "\"" + escapeNewLines(toStr(val).replace(/\"/g, "\\\"")) + "\"";
- } else {
- formattedValue = val;
- }
- return formattedValue;
- }
-
- for (i = 0, len = dataValues.length - 1; i <= len; i++) {
- str += this.tab + "\"" + dataValues[i][0] + "\"" + this.colon + formatValue(dataValues[i][1], this.tab, true);
- if (i < len) {
- str += ",";
- }
- str += this.lineBreak;
- }
-
- str += "}" + this.lineBreak;
- return str;
- };
+ JsonLayout.prototype.format = function(loggingEvent) {
+ var layout = this;
+ var dataValues = this.getDataValues(loggingEvent, this.combineMessages);
+ var str = "{" + this.lineBreak;
+ var i, len;
+
+ function formatValue(val, prefix, expand) {
+ // Check the type of the data value to decide whether quotation marks
+ // or expansion are required
+ var formattedValue;
+ var valType = typeof val;
+ if (val instanceof Date) {
+ formattedValue = String(val.getTime());
+ } else if (expand && (val instanceof Array)) {
+ formattedValue = "[" + layout.lineBreak;
+ for (var i = 0, len = val.length; i < len; i++) {
+ var childPrefix = prefix + layout.tab;
+ formattedValue += childPrefix + formatValue(val[i], childPrefix, false);
+ if (i < val.length - 1) {
+ formattedValue += ",";
+ }
+ formattedValue += layout.lineBreak;
+ }
+ formattedValue += prefix + "]";
+ } else if (valType !== "number" && valType !== "boolean") {
+ formattedValue = "\"" + escapeNewLines(toStr(val).replace(/\"/g, "\\\"")) + "\"";
+ } else {
+ formattedValue = val;
+ }
+ return formattedValue;
+ }
+
+ for (i = 0, len = dataValues.length - 1; i <= len; i++) {
+ str += this.tab + "\"" + dataValues[i][0] + "\"" + this.colon + formatValue(dataValues[i][1], this.tab, true);
+ if (i < len) {
+ str += ",";
+ }
+ str += this.lineBreak;
+ }
+
+ str += "}" + this.lineBreak;
+ return str;
+ };
JsonLayout.prototype.ignoresThrowable = function() {
- return false;
+ return false;
};
JsonLayout.prototype.toString = function() {
- return "JsonLayout";
+ return "JsonLayout";
};
JsonLayout.prototype.getContentType = function() {
@@ -1340,11 +1276,11 @@ var log4javascript = (function() {
};
HttpPostDataLayout.prototype.ignoresThrowable = function(loggingEvent) {
- return false;
+ return false;
};
HttpPostDataLayout.prototype.toString = function() {
- return "HttpPostDataLayout";
+ return "HttpPostDataLayout";
};
log4javascript.HttpPostDataLayout = HttpPostDataLayout;
@@ -1355,7 +1291,7 @@ var log4javascript = (function() {
var objectsExpanded = [];
function doFormat(obj, depth, indentation) {
- var i, j, len, childDepth, childIndentation, childLines, expansion,
+ var i, len, childDepth, childIndentation, childLines, expansion,
childExpansion;
if (!indentation) {
@@ -1400,8 +1336,8 @@ var log4javascript = (function() {
}
expansion += childLines.join("," + newLine) + newLine + indentation + "]";
return expansion;
- } else if (Object.prototype.toString.call(obj) == "[object Date]") {
- return obj.toString();
+ } else if (Object.prototype.toString.call(obj) == "[object Date]") {
+ return obj.toString();
} else if (typeof obj == "object" && depth > 0) {
objectsExpanded.push(obj);
expansion = "{" + newLine;
@@ -1816,11 +1752,11 @@ var log4javascript = (function() {
fieldIndex = fieldIndex - 1;
}
}
- var val = this.customFields[fieldIndex].value;
- if (typeof val == "function") {
- val = val(this, loggingEvent);
- }
- replacement = val;
+ var val = this.customFields[fieldIndex].value;
+ if (typeof val == "function") {
+ val = val(this, loggingEvent);
+ }
+ replacement = val;
}
break;
case "n": // New line
@@ -1875,11 +1811,11 @@ var log4javascript = (function() {
};
PatternLayout.prototype.ignoresThrowable = function() {
- return true;
+ return true;
};
PatternLayout.prototype.toString = function() {
- return "PatternLayout";
+ return "PatternLayout";
};
log4javascript.PatternLayout = PatternLayout;
@@ -1914,18 +1850,18 @@ var log4javascript = (function() {
BrowserConsoleAppender.prototype.append = function(loggingEvent) {
var appender = this;
- var getFormattedMessage = function() {
+ var getFormattedMessage = function(concatenate) {
var formattedMessage = appender.getLayout().formatWithException(loggingEvent);
- return (typeof formattedMessage == "string") ? [formattedMessage] : formattedMessage;
+ return (typeof formattedMessage == "string") ?
+ (concatenate ? formattedMessage : [formattedMessage]) :
+ (concatenate ? formattedMessage.join(" ") : formattedMessage);
};
- var console;
-
- if ( (console = window.console) && console.log) { // Safari and Firebug
- var formattedMessage = getFormattedMessage();
+ var console = window.console;
+ if (console && console.log) {
// Log to Firebug or the browser console using specific logging
- // methods or revert to console.log otherwise
+ // methods or revert to console.log otherwise
var consoleMethodName;
if (console.debug && Level.DEBUG.isGreaterOrEqual(loggingEvent.level)) {
@@ -1940,13 +1876,13 @@ var log4javascript = (function() {
consoleMethodName = "log";
}
- if (console[consoleMethodName].apply) {
- console[consoleMethodName].apply(console, formattedMessage);
+ if (typeof console[consoleMethodName].apply == "function") {
+ console[consoleMethodName].apply(console, getFormattedMessage(false));
} else {
- console[consoleMethodName](formattedMessage);
+ console[consoleMethodName]( getFormattedMessage(true) );
}
} else if ((typeof opera != "undefined") && opera.postError) { // Opera
- opera.postError(getFormattedMessage());
+ opera.postError( getFormattedMessage(true) );
}
};
@@ -2230,10 +2166,6 @@ var log4javascript = (function() {
try {
var xmlHttp = getXmlHttp(xmlHttpErrorHandler);
if (isSupported) {
- // Add withCredentials to facilitate CORS requests with cookies
- if (withCredentials && withCredentialsSupported) {
- xmlHttp.withCredentials = true;
- }
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4) {
if (isHttpRequestSuccessful(xmlHttp)) {
@@ -2256,6 +2188,10 @@ var log4javascript = (function() {
}
};
xmlHttp.open("POST", url, true);
+ // Add withCredentials to facilitate CORS requests with cookies
+ if (withCredentials && withCredentialsSupported) {
+ xmlHttp.withCredentials = true;
+ }
try {
for (var i = 0, header; header = headers[i++]; ) {
xmlHttp.setRequestHeader(header.name, header.value);
@@ -2318,9 +2254,7 @@ var log4javascript = (function() {
if (oldBeforeUnload) {
oldBeforeUnload();
}
- if (sendAllRemaining()) {
- return "Sending log messages";
- }
+ sendAllRemaining();
};
}
// Start timer
@@ -2355,15 +2289,15 @@ var log4javascript = (function() {
// PopUpAppender and InPageAppender related
function setCookie(name, value, days, path) {
- var expires;
- path = path ? "; path=" + path : "";
+ var expires;
+ path = path ? "; path=" + path : "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toGMTString();
} else {
- expires = "";
- }
+ expires = "";
+ }
document.cookie = escape(name) + "=" + escape(value) + expires + path;
}
@@ -2373,11 +2307,11 @@ var log4javascript = (function() {
for (var i = 0, len = ca.length; i < len; i++) {
var c = ca[i];
while (c.charAt(0) === " ") {
- c = c.substring(1, c.length);
+ c = c.substring(1, c.length);
}
if (c.indexOf(nameEquals) === 0) {
- return unescape(c.substring(nameEquals.length, c.length));
- }
+ return unescape(c.substring(nameEquals.length, c.length));
+ }
}
return null;
}
@@ -2392,8 +2326,8 @@ var log4javascript = (function() {
return (lastSlash == -1) ? "" : scripts[i].src.substr(0, lastSlash + 1);
}
}
- return null;
- }
+ return null;
+ }
function isLoaded(win) {
try {
@@ -2576,7 +2510,7 @@ var log4javascript = (function() {
' }',
' } else {',
' var groupElementContainer = this;',
-' ',
+'',
' this.mainDiv = document.createElement("div");',
' this.mainDiv.className = "group";',
'',
@@ -2588,7 +2522,7 @@ var log4javascript = (function() {
' this.expander.unselectable = true;',
' var expanderText = this.group.expanded ? "-" : "+";',
' this.expanderTextNode = this.expander.appendChild(document.createTextNode(expanderText));',
-' ',
+'',
' this.headingDiv.appendChild(document.createTextNode(" " + this.group.name));',
'',
' this.contentDiv = this.mainDiv.appendChild(document.createElement("div"));',
@@ -3046,7 +2980,7 @@ var log4javascript = (function() {
' rootGroup = new Group("root", true);',
' rootGroup.render();',
' currentGroup = rootGroup;',
-' ',
+'',
' setCommandInputWidth();',
' setLogContainerHeight();',
' toggleLoggingEnabled();',
@@ -3171,9 +3105,9 @@ var log4javascript = (function() {
'',
' function LogItemContentReverser() {',
' }',
-' ',
+'',
' LogItemContentReverser.prototype = new LogItemVisitor();',
-' ',
+'',
' LogItemContentReverser.prototype.visitGroup = function(group) {',
' group.reverseChildren();',
' this.visitChildren(group);',
@@ -4193,10 +4127,10 @@ var log4javascript = (function() {
'',
' if (!Array.prototype.push) {',
' Array.prototype.push = function() {',
-' for (var i = 0, len = arguments.length; i < len; i++){',
-' this[this.length] = arguments[i];',
-' }',
-' return this.length;',
+' for (var i = 0, len = arguments.length; i < len; i++){',
+' this[this.length] = arguments[i];',
+' }',
+' return this.length;',
' };',
' }',
'',
@@ -4544,7 +4478,7 @@ var log4javascript = (function() {
' span.pre {',
' white-space: pre;',
' }',
-' ',
+'',
' pre.unwrapped {',
' display: inline !important;',
' }',
@@ -4728,8 +4662,7 @@ var log4javascript = (function() {
var showCommandLine = this.defaults.showCommandLine;
var commandLineObjectExpansionDepth = this.defaults.commandLineObjectExpansionDepth;
var showHideButton = this.defaults.showHideButton;
- var showCloseButton = this.defaults.showCloseButton;
- var showLogEntryDeleteButtons = this.defaults.showLogEntryDeleteButtons;
+ var showCloseButton = this.defaults.showCloseButton;
this.setLayout(this.defaults.layout);
@@ -4882,14 +4815,14 @@ var log4javascript = (function() {
}
};
- this.group = function(name, initiallyExpanded) {
+ this.group = function(name, initiallyExpanded) {
if (isSupported) {
queuedLoggingEvents.push(new QueuedGroup(name, initiallyExpanded));
checkAndAppend();
}
};
- this.groupEnd = function() {
+ this.groupEnd = function() {
if (isSupported) {
queuedLoggingEvents.push(new QueuedGroupEnd());
checkAndAppend();
@@ -4897,7 +4830,6 @@ var log4javascript = (function() {
};
var appendQueuedLoggingEvents = function() {
- var currentLoggingEvent;
while (queuedLoggingEvents.length > 0) {
queuedLoggingEvents.shift().append();
}
@@ -5009,9 +4941,9 @@ var log4javascript = (function() {
window.evalExpr = expr;
commandWindow.execScript("window.result=eval(window.evalExpr);");
result = window.result;
- } else {
- result = commandWindow.eval(expr);
- }
+ } else {
+ result = commandWindow.eval(expr);
+ }
commandOutput = isUndefined(result) ? result : formatObjectExpansion(result, commandLineObjectExpansionDepth);
// Restore variables in the command window to their original state
@@ -5517,8 +5449,7 @@ var log4javascript = (function() {
commandLineObjectExpansionDepth: 1,
showHideButton: false,
showCloseButton: true,
- showLogEntryDeleteButtons: true,
- useDocumentWrite: true
+ useDocumentWrite: true
};
PopUpAppender.prototype.toString = function() {
@@ -5550,8 +5481,8 @@ var log4javascript = (function() {
commandLineObjectExpansionDepth: 1,
showHideButton: false,
showCloseButton: false,
- showLogEntryDeleteButtons: true,
- useDocumentWrite: true
+ showLogEntryDeleteButtons: true,
+ useDocumentWrite: true
};
InPageAppender.prototype.toString = function() {
@@ -5642,7 +5573,6 @@ var log4javascript = (function() {
function getStyleAttributeValue(el) {
var stylePairs = el.style.cssText.split(";");
var styleValue = "";
- var isFirst = true;
for (var j = 0, len = stylePairs.length; j < len; j++) {
var nameValueBits = stylePairs[j].split(":");
var props = [];
@@ -5663,11 +5593,12 @@ var log4javascript = (function() {
return RegExp.$1.toLowerCase();
}
}
- return "";
+ return "";
}
var lt = "<";
var gt = ">";
+ var i, len;
if (includeRootNode && rootNode.nodeType != nodeTypes.DOCUMENT_FRAGMENT_NODE) {
switch (rootNode.nodeType) {
@@ -5713,7 +5644,7 @@ var log4javascript = (function() {
var childStartNewLine = !(rootNode.childNodes.length === 1 &&
rootNode.childNodes[0].nodeType === nodeTypes.TEXT_NODE);
var childPreformatted = array_contains(preFormattedElements, tagName);
- for (var i = 0, len = rootNode.childNodes.length; i < len; i++) {
+ for (i = 0, len = rootNode.childNodes.length; i < len; i++) {
xhtml += getXhtml(rootNode.childNodes[i], true, indentation + indentationUnit,
childStartNewLine, childPreformatted);
}
@@ -5732,7 +5663,7 @@ var log4javascript = (function() {
// Trim whitespace from each line of the text node
var lines = splitIntoLines(trim(rootNode.nodeValue));
var trimmedLines = [];
- for (var i = 0, len = lines.length; i < len; i++) {
+ for (i = 0, len = lines.length; i < len; i++) {
trimmedLines[i] = trim(lines[i]);
}
xhtml = trimmedLines.join(newLine + indentation);
@@ -5747,7 +5678,7 @@ var log4javascript = (function() {
case nodeTypes.DOCUMENT_NODE:
xhtml = "";
// Add output for childNodes collection (which doesn't include attribute nodes)
- for (var i = 0, len = rootNode.childNodes.length; i < len; i++) {
+ for (i = 0, len = rootNode.childNodes.length; i < len; i++) {
xhtml += getXhtml(rootNode.childNodes[i], true, indentation);
}
return xhtml;
@@ -5757,7 +5688,7 @@ var log4javascript = (function() {
} else {
xhtml = "";
// Add output for childNodes collection (which doesn't include attribute nodes)
- for (var i = 0, len = rootNode.childNodes.length; i < len; i++) {
+ for (i = 0, len = rootNode.childNodes.length; i < len; i++) {
xhtml += getXhtml(rootNode.childNodes[i], true, indentation + indentationUnit);
}
return xhtml;
@@ -5780,7 +5711,6 @@ var log4javascript = (function() {
ConsoleAppender.addGlobalCommandLineFunction("dirxml", function(appender, args, returnValue) {
var lines = [];
for (var i = 0, len = args.length; i < len; i++) {
- var win = appender.getCommandWindow();
lines[i] = getXhtml(args[i]);
}
return lines.join(newLine + newLine);
@@ -5857,36 +5787,40 @@ var log4javascript = (function() {
init();
})();
+ /* ---------------------------------------------------------------------- */
+
+ function createDefaultLogger() {
+ var logger = log4javascript.getLogger(defaultLoggerName);
+ var a = new log4javascript.PopUpAppender();
+ logger.addAppender(a);
+ return logger;
+ }
+
/* ---------------------------------------------------------------------- */
// Main load
- log4javascript.setDocumentReady = function() {
- pageLoaded = true;
- log4javascript.dispatchEvent("load", {});
- };
-
- if (window.addEventListener) {
- window.addEventListener("load", log4javascript.setDocumentReady, false);
- } else if (window.attachEvent) {
- window.attachEvent("onload", log4javascript.setDocumentReady);
- } else {
- var oldOnload = window.onload;
- if (typeof window.onload != "function") {
- window.onload = log4javascript.setDocumentReady;
- } else {
- window.onload = function(evt) {
- if (oldOnload) {
- oldOnload(evt);
- }
- log4javascript.setDocumentReady();
- };
- }
- }
-
- // Ensure that the log4javascript object is available in the window. This
- // is necessary for log4javascript to be available in IE if loaded using
- // Dojo's module system
- window.log4javascript = log4javascript;
-
- return log4javascript;
-})();
\ No newline at end of file
+ log4javascript.setDocumentReady = function() {
+ pageLoaded = true;
+ log4javascript.dispatchEvent("load", {});
+ };
+
+ if (window.addEventListener) {
+ window.addEventListener("load", log4javascript.setDocumentReady, false);
+ } else if (window.attachEvent) {
+ window.attachEvent("onload", log4javascript.setDocumentReady);
+ } else {
+ var oldOnload = window.onload;
+ if (typeof window.onload != "function") {
+ window.onload = log4javascript.setDocumentReady;
+ } else {
+ window.onload = function(evt) {
+ if (oldOnload) {
+ oldOnload(evt);
+ }
+ log4javascript.setDocumentReady();
+ };
+ }
+ }
+
+ return log4javascript;
+}, this);
\ No newline at end of file
diff --git a/package.json b/package.json
index 59b6358..9e40535 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name" : "log4javascript",
"title" : "log4javascript",
- "version" : "1.4.9",
+ "version" : "1.4.13",
"author" : {
"name" : "Tim Down",
"email" : "tim@log4javascript.org",
@@ -17,6 +17,6 @@
],
"repository" : {
"type": "git",
- "url" : "https://github.com/DECK36/log4javascript.git"
+ "url" : "https://github.com/Ritzlgrmft/log4javascript.git"
}
}
From 54922a642aa0061fc6263fd99a84cdfa81bf7248 Mon Sep 17 00:00:00 2001
From: Ritzlgrmft
Date: Fri, 6 May 2016 17:21:21 +0200
Subject: [PATCH 2/5] TypeScript definitions added
---
log4javascript.d.ts | 1097 +++++++++++++++++++++++++++++++++++++++++++
package.json | 23 +-
2 files changed, 1109 insertions(+), 11 deletions(-)
create mode 100644 log4javascript.d.ts
diff --git a/log4javascript.d.ts b/log4javascript.d.ts
new file mode 100644
index 0000000..c305bb5
--- /dev/null
+++ b/log4javascript.d.ts
@@ -0,0 +1,1097 @@
+// Generated by typings
+// Source: https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/2d448c0a3152e8871521848c5c2c61ab4e2a2cc9/log4javascript/log4javascript.d.ts
+// Type definitions for log4javascript v1.4.10
+// Project: http://log4javascript.org/
+// Definitions by: Markus Wagner
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+
+// #region log4javascript static properties/methods
+
+/**
+ * Returns a logger with the specified name, creating it if a logger with that name does not already exist.
+ * If no name is specified, a logger is returned with name [anonymous], and subsequent calls to getLogger()
+ * (with no logger name specified) will return this same logger object.
+ * Note that the names [anonymous], [default], [null] and root are reserved for the anonymous logger, default logger,
+ * null logger and root logger respectively.
+ */
+export function getLogger(loggerName?: string): Logger;
+
+/**
+ * Convenience method that returns the default logger. The default logger has a single appender: a PopUpAppender with the default
+ * layout, width and height, and with focusPopUp set to false and lazyInit, useOldPopUp and complainAboutPopUpBlocking all set to true.
+ */
+export function getDefaultLogger(): Logger;
+
+/**
+ * Returns an empty logger with no appenders. Useful for disabling all logging.
+ */
+export function getNullLogger(): Logger;
+
+/**
+ * Returns the root logger from which all other loggers derive.
+ */
+export function getRootLogger(): Logger;
+
+/**
+ * Resets the all loggers to their default level.
+ */
+export function resetConfiguration(): void;
+
+/**
+ * Enables or disables all logging, depending on enabled.
+ */
+export function setEnabled(enabled: boolean): void;
+
+/**
+ * Returns true or false depending on whether logging is enabled.
+ */
+export function isEnabled(): boolean;
+
+/**
+ * Adds a function to be called when an event of the type specified occurs in log4javascript.
+ * Supported event types are load (occurs once the page has loaded) and error.
+ */
+export function addEventListener(eventType: string, listener: { (sender: any, eventType: string, eventArgs: any): void; }): void;
+
+/**
+ * Removes the event listener function supplied for the event of the type specified.
+ */
+export function removeEventListener(eventType: string, listener: { (sender: any, eventType: string, eventArgs: any): void; }): void;
+
+/**
+ * Raises an event of type eventType on the log4javascript object. Each of the listeners for this type of event
+ * (registered via addEventListener) is called and passed eventArgs as the third parameter.
+ */
+export function dispatchEvent(eventType: string, eventArgs: any): void;
+
+/**
+ * Used internally to specify the types of events that the log4javascript object can raise.
+ */
+export function setEventTypes(eventTypes: string[]): void;
+
+/**
+ * Enables or disables displaying of error stack traces, depending on show. By default, stack traces are not displayed.
+ * (Only works in Firefox)
+ */
+export function setShowStackTraces(show: boolean): void;
+
+/**
+ * This evaluates the given expression in the log4javascript scope, thus allowing scripts to access internal
+ * log4javascript variables and functions. This was written for the purposes of automated testing but could be used by
+ * custom extensions to log4javascript.
+ */
+export function evalInScope(expr: string): any;
+
+// #endregion
+
+// #region Levels
+
+/**
+ * Levels are available as static properties of the log4javascript.Level object.
+ */
+export enum Level { ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF }
+
+// #endregion
+
+// #region Loggers
+
+/**
+ * It is possible to have multiple loggers in log4javascript. For example, you may wish to have a logger for debugging purposes
+ * that logs messages to a pop-up window and a separate logger that reports any client-side application errors to the server via Ajax.
+ * From version 1.4, log4javascript has hierarchical loggers, implemented in the same way as log4j. In summary, you specify a
+ * logger's parent logger by means of a dot between the parent logger name and the child logger name. Therefore the logger
+ * tim.app.security inherits from tim.app, which in turn inherits from tim which, finally, inherits from the root logger.
+ * What inheritance means for a logger is that in the absence of a threshold level set specifically on the logger it inherits
+ * its level from its parent; also, a logger inherits all its parent's appenders (this is known as appender additivity in log4j.
+ * This behaviour can be enabled or disabled via setAdditivity(). See below). In the above example, if the root logger has a
+ * level of DEBUG and one appender, each of the loggers tim.app.security, tim.app and tim would inherit the root level's appender.
+ * If, say, tim.app's threshold level was set to WARN, tim's effective level would remain at DEBUG (inherited from the root logger)
+ * while tim.app.security's effective level would be WARN, inherited from tim.app. The important thing to note is that appenders
+ * accumulate down the logger hierarchy while levels are simply inherited from the nearest ancestor with a threshold level set.
+ * For a detailed explanation of the logger hierarchy, see the log4j manual.
+ */
+export class Logger {
+ /**
+ * Adds the given appender.
+ */
+ addAppender(appender: Appender): void;
+
+ /**
+ * Removes the given appender.
+ */
+ removeAppender(appender: Appender): void;
+
+ /**
+ * Clears all appenders for the current logger.
+ */
+ removeAllAppenders(): void;
+
+ /**
+ * Sets the level. Log messages of a lower level than level will not be logged. Default value is DEBUG.
+ */
+ setLevel(level: Level): void;
+
+ /**
+ * Returns the level explicitly set for this logger or null if none has been set.
+ */
+ getLevel(): Level;
+
+ /**
+ * Returns the level at which the logger is operating. This is either the level explicitly set on the logger or, if no level
+ * has been set, the effective level of the logger's parent.
+ */
+ getEffectiveLevel(): Level;
+
+ /**
+ * Sets whether appender additivity is enabled (the default) or disabled. If set to false, this particular logger will not
+ * inherit any appenders form its ancestors. Any descendant of this logger, however, will inherit from its ancestors as
+ * normal, unless its own additivity is explicitly set to false.
+ * Default value is true.
+ */
+ setAdditivity(additivity: boolean): void;
+
+ /**
+ * Returns whether additivity is enabled for this logger.
+ */
+ getAdditivity(): boolean;
+
+ /**
+ * Generic logging method used by wrapper methods such as debug, error etc.
+ */
+ log(level: Level, params: any[]): void;
+
+ /**
+ * Logs one or more messages and optionally an error at level TRACE.
+ */
+ trace(...messages: any[]): void;
+
+ /**
+ * Logs one or more messages and optionally an error at level DEBUG.
+ */
+ debug(...messages: any[]): void;
+
+ /**
+ * Logs one or more messages and optionally an error at level INFO.
+ */
+ info(...messages: any[]): void;
+
+ /**
+ * Logs one or more messages and optionally an error at level WARN.
+ */
+ warn(...messages: any[]): void;
+
+ /**
+ * Logs one or more messages and optionally an error at level ERROR.
+ */
+ error(...messages: any[]): void;
+
+ /**
+ * Logs one or more messages and optionally an error at level FATAL.
+ */
+ fatal(...messages: any[]): void;
+
+ /**
+ * Returns whether the logger is enabled for the specified level.
+ */
+ isEnabledFor(level: Level, exception: Error): boolean;
+
+ /**
+ * Returns whether the logger is enabled for TRACE messages.
+ */
+ isTraceEnabled(): boolean;
+
+ /**
+ * Returns whether the logger is enabled for DEBUG messages.
+ */
+ isDebugEnabled(): boolean;
+
+ /**
+ * Returns whether the logger is enabled for INFO messages.
+ */
+ isInfoEnabled(): boolean;
+
+ /**
+ * Returns whether the logger is enabled for WARN messages.
+ */
+ isWarnEnabled(): boolean;
+
+ /**
+ * Returns whether the logger is enabled for ERROR messages.
+ */
+ isErrorEnabled(): boolean;
+
+ /**
+ * Returns whether the logger is enabled for FATAL messages.
+ */
+ isFatalEnabled(): boolean;
+
+ /**
+ * Starts a new group of log messages. In appenders that support grouping (currently PopUpAppender and InPageAppender),
+ * a group appears as an expandable section in the console, labelled with the name specified. Specifying initiallyExpanded
+ * determines whether the group starts off expanded (the default is true). Groups may be nested.
+ */
+ group(name: string, initiallyExpanded?: boolean): void;
+
+ /**
+ * Ends the current group. If there is no group then this function has no effect.
+ */
+ groupEnd(): void;
+
+ /**
+ * Starts a timer with name name. When the timer is ended with a call to timeEnd using the same name, the amount of time
+ * that has elapsed in milliseconds since the timer was started is logged at level level. If not level is supplied, the level
+ * defaults to INFO.
+ */
+ time(name: string, level?: Level): void;
+
+ /**
+ * Ends the timer with name name and logs the time elapsed.
+ */
+ timeEnd(name: string): void;
+
+ /**
+ * Asserts the given expression is true or evaluates to true. If so, nothing is logged. If not, an error is logged at the ERROR level.
+ */
+ assert(expr: any): void;
+
+ name: string;
+}
+
+// #endregion
+
+// #region Appenders
+
+/**
+ * Logging event.
+ */
+export class LoggingEvent {
+ logger: Logger;
+ timeStamp: Date;
+ timeStampInMilliseconds: number;
+ timeStampInSeconds: number;
+ milliseconds: number;
+ level: Level;
+ messages: any[];
+ exception: Error;
+
+ constructor(logger: Logger, timeStamp: Date, level: Level, messages: string[], exception?: Error);
+
+ getThrowableStrRep: () => string;
+ getCombinedMessages: () => string;
+ toString: () => string;
+}
+
+/**
+ * There are methods common to all appenders, as listed below.
+ */
+export class Appender {
+
+ /**
+ * Checks the logging event's level is at least as severe as the appender's threshold and calls the appender's append method if so.
+ * This method should not in general be used directly or overridden.
+ */
+ doAppend(loggingEvent: LoggingEvent): void;
+
+ /**
+ * Appender-specific method to append a log message. Every appender object should implement this method.
+ */
+ append(loggingEvent: LoggingEvent): void;
+
+ /**
+ * Sets the appender's layout.
+ */
+ setLayout(layout: Layout): void;
+
+ /**
+ * Returns the appender's layout.
+ */
+ getLayout(): Layout;
+
+ /**
+ * Sets the appender's threshold. Log messages of level less severe than this threshold will not be logged.
+ */
+ setThreshold(level: Level): void;
+
+ /**
+ * Returns the appender's threshold.
+ */
+ getThreshold(): Level;
+
+ /**
+ * Returns a string representation of the appender. Every appender object should implement this method.
+ */
+ toString(): string;
+
+}
+
+/**
+ * Displays a log message as a JavaScript alert.
+ */
+export class AlertAppender extends Appender {
+ /**
+ * Constructor
+ */
+ constructor();
+}
+
+/**
+ * A flexible appender that asynchronously sends log messages to a server via HTTP.
+ * The default configuration is to send each log message as a separate HTTP post request to the server using an
+ * HttpPostDataLayout, without waiting for a response before sending any subsequent requests.
+ */
+export class AjaxAppender extends Appender {
+ /**
+ * Constructor
+ * @param url The URL to which log messages should be sent. Note that this is subject to the usual Ajax restrictions:
+ * the URL should be in the same domain as that of the page making the request.
+ * @param withCredentials Specifies whether cookies should be sent with each request.
+ */
+ constructor(url: string, withCredentials?: boolean);
+
+ /**
+ * Whether to send all remaining unsent log messages to the server when the page unloads.
+ * Since version 1.4.3, the default value is false. Previously the default was true.
+ */
+ setSendAllOnUnload(sendAllOnUnload: boolean): void;
+
+ /**
+ * Returns whether all remaining unsent log messages are sent to the server when the page unloads.
+ */
+ isSendAllOnUnload(): boolean;
+
+ /**
+ * Sets the post variable name whose value will the formatted log message(s) for each request.
+ * Default value is data.
+ */
+ setPostVarName(postVarName: string): void;
+
+ /**
+ * Returns the post variable name whose value will the formatted log message(s) for each request.
+ */
+ getPostVarName(): string;
+
+ /**
+ * Whether to send log messages to the server at regular, timed intervals.
+ * Default value is false.
+ */
+ setTimed(timed: boolean): void;
+
+ /**
+ * Returns whether log messages are sent to the server at regular, timed intervals.
+ */
+ isTimed(): boolean;
+
+ /**
+ * Sets whether to wait for a response from a previous HTTP request from this appender before sending the next log
+ * message / batch of messages.
+ * Default value is false.
+ */
+ setWaitForResponse(waitForResponse: boolean): void;
+
+ /**
+ * Returns whether the appender waits for a response from a previous HTTP request from this appender before sending the next
+ * log message / batch of messages.
+ */
+ isWaitForResponse(): boolean;
+
+ /**
+ * Sets the number of log messages to send in each request. If not specified, defaults to 1.
+ */
+ setBatchSize(batchSize: number): void;
+
+ /**
+ * Returns the number of log messages sent in each request. See above for more details.
+ */
+ getBatchSize(): number;
+
+ /**
+ * Sets the length of time in milliseconds between each sending of queued log messages.
+ */
+ setTimerInterval(timerInterval: number): void;
+
+ /**
+ * Returns the length of time in milliseconds between each sending of queued log messages. See above for more details.
+ */
+ getTimerInterval(): number;
+
+ /**
+ * Sets the function that is called whenever a successful request is made, called at the point at which the response is
+ * received. This feature can be used to confirm whether a request has been successful and act accordingly.
+ * A single parameter, xmlHttp, is passed to the callback function. This is the XMLHttpRequest object that performed the
+ * request.
+ */
+ setRequestSuccessCallback(requestSuccessCallback: { (xmlHttp: XMLHttpRequest): void; }): void;
+
+ /**
+ * Sets the function that is called whenever any kind of failure occurs in the appender, including browser deficiencies or
+ * configuration errors (e.g. supplying a non-existent URL to the appender). This feature can be used to handle
+ * AjaxAppender-specific errors.
+ * A single parameter, message, is passed to the callback function. This is the error-specific message that caused the failure.
+ */
+ setFailCallback(failCallback: { (message: string): void; }): void;
+
+ /**
+ * Sets the session id sent to the server each time a request is made.
+ */
+ setSessionId(sessionId: string): void;
+
+ /**
+ * Returns the session id sent to the server each time a request is made.
+ */
+ getSessionId(): string;
+
+ /**
+ * Adds an HTTP header that is sent with each request.
+ */
+ addHeader(name: string, value: string): void;
+
+ /**
+ * Returns an array of the additional headers that are sent with each HTTP request. Each array item is an object with
+ * properties name and value.
+ */
+ getHeaders(): Array<{ name: string; value: string; }>;
+
+ /**
+ * Sends all log messages in the queue. If log messages are batched then only completed batches are sent.
+ */
+ sendAll(): void;
+}
+
+/**
+ * Logs messages to a pop-up console window (note: you will need to disable pop-up blockers to use it). The pop-up displays a
+ * list of all log messages.
+ */
+export class PopUpAppender extends Appender {
+ /**
+ * Constructor
+ * @param lazyInit Set this to true to open the pop-up only when the first log message reaches the appender. Otherwise, the
+ * pop-up window opens as soon as the appender is created. If not specified, defaults to false.
+ * @param initiallyMinimized Whether the console window should start off hidden / minimized. If not specified, defaults to false.
+ * @param useDocumentWrite Specifies how the console window is created. By default, the console window is created dynamically
+ * using document's write method. This has the advantage of keeping all the code in one single JavaScript file. However,
+ * if your page sets document.domain then the browser prevents script access to a window unless it too has the same value
+ * set for document.domain. To get round this issue, you can set useDocumentWrite to false and log4javascript will instead
+ * use the external HTML file console.html (or console_uncompressed.html if you're using an uncompressed version of
+ * log4javascript.js), which must be placed in the same directory as your log4javascript.js file.
+ * Note that if useDocumentWrite is set to true, the old pop-up window will always be closed and a new one created whenever
+ * the page is refreshed, even if setUseOldPopUp(true) has been called.
+ * In general it's simpler to use the document.write method, so unless your page needs to set document.domain,
+ * useDocumentWrite should be set to true.
+ * If not specified, defaults to true.
+ * @param width The outer width in pixels of the pop-up window. If not specified, defaults to 600.
+ * @param height The outer height in pixels of the pop-up window. If not specified, defaults to 400.
+ */
+ constructor(lazyInit?: boolean, initiallyMinimized?: boolean, useDocumentWrite?: boolean, width?: number, height?: number);
+
+ /**
+ * Returns whether the console window starts off hidden / minimized.
+ */
+ isInitiallyMinimized(): boolean;
+
+ /**
+ * Sets whether the console window should start off hidden / minimized.
+ */
+ setInitiallyMinimized(initiallyMinimized: boolean): void;
+
+ /**
+ * Returns whether the pop-up window is focussed (i.e. brought it to the front) when a new log message is added. Default value is false.
+ */
+ isFocusPopUp(): boolean;
+
+ /**
+ * Sets whether to focus the pop-up window (i.e. bring it to the front) when a new log message is added.
+ */
+ setFocusPopUp(focusPopUp: boolean): void;
+
+ /**
+ * Returns whether the same pop-up window is used if the main page is reloaded. If set to true, when the page is reloaded a
+ * line is drawn in the pop-up and subsequent log messages are added to the same pop-up. Otherwise, a new pop-up window is
+ * created that replaces the original pop-up. If not specified, defaults to true.
+ */
+ isUseOldPopUp(): boolean;
+
+ /**
+ * Sets whether to use the same pop-up window if the main page is reloaded. See isUseOldPopUp above for details.
+ */
+ setUseOldPopUp(useOldPopUp: boolean): void;
+
+ /**
+ * Returns whether an alert is shown to the user when the pop-up window cannot be created as a result of a pop-up blocker.
+ * Default value is true.
+ */
+ isComplainAboutPopUpBlocking(): boolean;
+
+ /**
+ * Sets whether to announce to show an alert to the user when the pop-up window cannot be created as a result of a pop-up blocker.
+ */
+ setComplainAboutPopUpBlocking(complainAboutPopUpBlocking: boolean): void;
+
+ /**
+ * Returns whether new log messages are displayed at the top of the pop-up window. Default value is false (i.e. log messages
+ * are appended to the bottom of the window).
+ */
+ isNewestMessageAtTop(): boolean;
+
+ /**
+ * Sets whether to display new log messages at the top inside the pop-up window.
+ */
+ setNewestMessageAtTop(newestMessageAtTop: boolean): void;
+
+ /**
+ * Returns whether the pop-up window scrolls to display the latest log message when a new message is logged. Default value is true.
+ */
+ isScrollToLatestMessage(): boolean;
+
+ /**
+ * Sets whether to scroll the pop-up window to display the latest log message when a new message is logged.
+ */
+ setScrollToLatestMessage(scrollToLatestMessage: boolean): void;
+
+ /**
+ * Returns whether the pop-up window reopens automatically after being closed when a new log message is logged. Default value is false.
+ */
+ isReopenWhenClosed(): boolean;
+
+ /**
+ * Sets whether to reopen the pop-up window automatically after being closed when a new log message is logged.
+ */
+ setReopenWhenClosed(reopenWhenClosed: boolean): void;
+
+ /**
+ * Returns the outer width in pixels of the pop-up window.
+ */
+ getWidth(): number;
+
+ /**
+ * Sets the outer width in pixels of the pop-up window.
+ */
+ setWidth(width: number): void;
+
+ /**
+ * Returns the outer height in pixels of the pop-up window.
+ */
+ getHeight(): number;
+
+ /**
+ * Sets the outer height in pixels of the pop-up window.
+ */
+ setHeight(height: number): void;
+
+ /**
+ * Returns the largest number of log messages that are displayed and stored by the the console. Once reached, a new log
+ * message wil cause the oldest message to be discarded. Default value is null, which means no limit is applied.
+ */
+ getMaxMessages(): number;
+
+ /**
+ * Sets the largest number of messages displayed and stored by the console window. Set this to null to make this number unlimited.
+ */
+ setMaxMessages(maxMessages: number): void;
+
+ /**
+ * Returns whether the console includes a command line. Default value is true.
+ */
+ isShowCommandLine(): boolean;
+
+ /**
+ * Sets whether the console includes a command line.
+ */
+ setShowCommandLine(showCommandLine: boolean): void;
+
+ /**
+ * Returns the number of levels to expand when an object value is logged to the console. Each property of an object above
+ * this threshold will be expanded if it is itself an object or array, otherwise its string representation will be displayed.
+ * Default value is 1 (i.e. the properties of the object logged will be displayed in their string representation but not expanded).
+ */
+ getCommandLineObjectExpansionDepth(): number;
+
+ /**
+ * Sets the number of levels to expand when an object value is logged to the console.
+ */
+ setCommandLineObjectExpansionDepth(expansionDepth: number): void;
+
+ /**
+ * Returns a reference to the window in which commands typed into the command line are currently being executed.
+ */
+ getCommandWindow(): Window;
+
+ /**
+ * Sets the window in which commands typed into the command line are executed.
+ */
+ setCommandWindow(commandWindow: Window): void;
+
+ /**
+ * Returns the layout used to format the output for commands typed into the command line. The default value is a
+ * PatternLayout with pattern string %m
+ */
+ getCommandLayout(): Layout;
+
+ /**
+ * Sets the layout used to format the output for commands typed into the command line.
+ */
+ setCommandLayout(commandLayout: Layout): void;
+
+ /**
+ * Clears all messages from the console window.
+ */
+ clear(): void;
+
+ /**
+ * Closes the pop-up window.
+ */
+ close(): void;
+
+ /**
+ * Opens the pop-up window, if not already open.
+ */
+ show(): void;
+
+ /**
+ * Closes the pop-up window.
+ */
+ hide(): void;
+
+ /**
+ * Brings the console window to the top and gives it the focus.
+ */
+ focus(): void;
+
+ /**
+ * Brings the console window to the top and gives the focus to the command line.
+ */
+ focusCommandLine(): void;
+
+ /**
+ * Brings the console window to the top and gives the focus to the search box.
+ */
+ focusSearch(): void;
+
+ /**
+ * Evaluates the expression and appends the result to the console.
+ */
+ evalCommandAndAppend(expr: string): void;
+
+ /**
+ * Adds a function with the name specified to the list of functions available on the command line. This feature may be used
+ * to add custom functions to the command line.
+ */
+ addCommandLineFunction(functionName: string,
+ commandLineFunction: { (appender: Appender, args: any, returnValue: { appendResult: boolean; isError: boolean; }): any; }): void;
+}
+
+/**
+ * Logs messages to a console window in the page. The console is identical to that used by the PopUpAppender, except for the
+ * absence of a 'Close' button.
+ */
+export class InPageAppender extends Appender {
+ /**
+ * Constructor
+ * @param container The container element for the console window. This should be an HTML element.
+ * @param lazyInit Set this to true to create the console only when the first log message reaches the appender. Otherwise,
+ * the console is initialized as soon as the appender is created. If not specified, defaults to true.
+ * @param initiallyMinimized Whether the console window should start off hidden / minimized. If not specified, defaults to false
+ * @param useDocumentWrite Specifies how the console window is created. By default, the console window is created dynamically
+ * using document's write method. This has the advantage of keeping all the code in one single JavaScript file. However,
+ * if your page sets document.domain then the browser prevents script access to a window unless it too has the same value
+ * set for document.domain. To get round this issue, you can set useDocumentWrite to false and log4javascript will instead
+ * use the external HTML file console.html (or console_uncompressed.html if you're using an uncompressed version of
+ * log4javascript.js), which must be placed in the same directory as your log4javascript.js file.
+ * In general it's simpler to use the document.write method, so unless your page needs to set document.domain,
+ * useDocumentWrite should be set to true.
+ * If not specified, defaults to true.
+ * @param width The width of the console window. Any valid CSS length may be used. If not specified, defaults to 100%.
+ * @param height The height of the console window. Any valid CSS length may be used. If not specified, defaults to 250px.
+ */
+ constructor(container: HTMLElement, lazyInit?: boolean, initiallyMinimized?: boolean,
+ useDocumentWrite?: boolean, width?: number, height?: number);
+
+ /**
+ * Sets a CSS style property on the HTML element containing the console iframe.
+ */
+ addCssProperty(name: string, value: string): void;
+
+ /**
+ * Returns whether the console window is currently visible.
+ */
+ isVisible(): boolean;
+
+ /**
+ * Returns whether the console window starts off hidden / minimized.
+ */
+ isInitiallyMinimized(): boolean;
+
+ /**
+ * Sets whether the console window should start off hidden / minimized.
+ */
+ setInitiallyMinimized(initiallyMinimized: boolean): void;
+
+ /**
+ * Returns whether new log messages are displayed at the top of the pop-up window. Default value is false (i.e. log messages
+ * are appended to the bottom of the window).
+ */
+ isNewestMessageAtTop(): boolean;
+
+ /**
+ * Sets whether to display new log messages at the top inside the pop-up window.
+ */
+ setNewestMessageAtTop(newestMessageAtTop: boolean): void;
+
+ /**
+ * Returns whether the pop-up window scrolls to display the latest log message when a new message is logged. Default value is true.
+ */
+ isScrollToLatestMessage(): boolean;
+
+ /**
+ * Sets whether to scroll the pop-up window to display the latest log message when a new message is logged.
+ */
+ setScrollToLatestMessage(scrollToLatestMessage: boolean): void;
+
+ /**
+ * Returns the outer width of the console window.
+ */
+ getWidth(): number;
+
+ /**
+ * Sets the outer width of the console window. Any valid CSS length may be used.
+ */
+ setWidth(width: number): void;
+
+ /**
+ * Returns the outer height of the console window.
+ */
+ getHeight(): number;
+
+ /**
+ * Sets the outer height of the console window. Any valid CSS length may be used.
+ */
+ setHeight(height: number): void;
+
+ /**
+ * Returns the largest number of messages displayed and stored by the console window.
+ */
+ getMaxMessages(): number;
+
+ /**
+ * Sets the largest number of messages displayed and stored by the console window. Set this to null to make this number unlimited.
+ */
+ setMaxMessages(maxMessages: number): void;
+
+ /**
+ * Returns whether the console includes a command line. Default value is true.
+ */
+ isShowCommandLine(): boolean;
+
+ /**
+ * Sets whether the console includes a command line.
+ */
+ setShowCommandLine(showCommandLine: boolean): void;
+
+ /**
+ * Returns the number of levels to expand when an object value is logged to the console. Each property of an object above
+ * this threshold will be expanded if it is itself an object or array, otherwise its string representation will be displayed.
+ * Default value is 1 (i.e. the properties of the object logged will be displayed in their string representation but not expanded).
+ */
+ getCommandLineObjectExpansionDepth(): number;
+
+ /**
+ * Sets the number of levels to expand when an object value is logged to the console.
+ */
+ setCommandLineObjectExpansionDepth(expansionDepth: number): void;
+
+ /**
+ * Returns a reference to the window in which commands typed into the command line are currently being executed.
+ */
+ getCommandWindow(): Window;
+
+ /**
+ * Sets the window in which commands typed into the command line are executed.
+ */
+ setCommandWindow(commandWindow: Window): void;
+
+ /**
+ * Returns the layout used to format the output for commands typed into the command line. The default value is a
+ * PatternLayout with pattern string %m
+ */
+ getCommandLayout(): Layout;
+
+ /**
+ * Sets the layout used to format the output for commands typed into the command line.
+ */
+ setCommandLayout(commandLayout: Layout): void;
+
+ /**
+ * Clears all messages from the console window.
+ */
+ clear(): void;
+
+ /**
+ * Closes the pop-up window.
+ */
+ close(): void;
+
+ /**
+ * Shows / unhides the console window.
+ */
+ show(): void;
+
+ /**
+ * Hides / minimizes the console window.
+ */
+ hide(): void;
+
+ /**
+ * Brings the console window to the top and gives it the focus.
+ */
+ focus(): void;
+
+ /**
+ * Brings the console window to the top and gives the focus to the command line.
+ */
+ focusCommandLine(): void;
+
+ /**
+ * Brings the console window to the top and gives the focus to the search box.
+ */
+ focusSearch(): void;
+
+ /**
+ * Evaluates the expression and appends the result to the console.
+ */
+ evalCommandAndAppend(expr: string): void;
+
+ /**
+ * Adds a function with the name specified to the list of functions available on the command line. This feature may be used
+ * to add custom functions to the command line.
+ */
+ addCommandLineFunction(functionName: string,
+ commandLineFunction: { (appender: Appender, args: any, returnValue: { appendResult: boolean; isError: boolean; }): any; }): void;
+}
+
+/**
+ * Writes log messages to the browser's built-in console, if present. This only works currently in Safari, Opera and Firefox
+ * with the excellent Firebug extension installed.
+ */
+export class BrowserConsoleAppender extends Appender {
+ /**
+ * Constructor
+ */
+ constructor();
+}
+
+//#endregion
+
+// #region Layouts
+
+/**
+ * There are a few methods common to all layouts.
+ */
+export class Layout {
+ /**
+ * Formats the log message. You should override this method in your own layouts.
+ */
+ format(loggingEvent: LoggingEvent): string;
+
+ /**
+ * Returns whether the layout ignores an error object in a logging event passed to its format method.
+ */
+ ignoresThrowable(): boolean;
+
+ /**
+ * Returns the content type of the output of the layout.
+ */
+ getContentType(): string;
+
+ /**
+ * Returns whether the layout's output is suitable for batching. JsonLayout and XmlLayout are the only built-in layouts that
+ * return true for this method.
+ */
+ allowBatching(): boolean;
+
+ /**
+ * Used internally by log4javascript in constructing formatted output for some layouts.
+ */
+ getDataValues(loggingEvent: LoggingEvent): Array;
+
+ /**
+ * This method is used to change the default keys used to create formatted name-value pairs for the properties of a log
+ * message, for layouts that do this. These layouts are JsonLayout and HttpPostDataLayout.
+ * @param loggerKey Parameter to use for the log message's logger name. Default is logger.
+ * @param timeStampKey Parameter to use for the log message's timestamp. Default is timestamp.
+ * @param levelKey Parameter to use for the log message's level. Default is level.
+ * @param messageKey Parameter to use for the message itself. Default is message.
+ * @param exceptionKey Parameter to use for the log message's error (exception). Default is exception.
+ * @param urlKey Parameter to use for the current page URL. Default is url.
+ */
+ setKeys(loggerKey: string, timeStampKey: string, levelKey: string, messageKey: string, exceptionKey: string, urlKey: string): void;
+
+ /**
+ * Some layouts (JsonLayout, HttpPostDataLayout, PatternLayout and XmlLayout) allow you to set custom fields (e.g. a session
+ * id to send to the server) to the formatted output. Use this method to set a custom field. If there is already a custom
+ * field with the specified name, its value will be updated with value.
+ * @param name Name of the custom property you wish to be included in the formmtted output.
+ * @param value Value of the custom property you wish to be included in the formatted output.
+ */
+ setCustomField(name: string, value: string): string;
+
+ /**
+ * Returns whether the layout has any custom fields.
+ */
+ hasCustomFields(): boolean;
+
+ formatWithException(loggingEvent: LoggingEvent): string;
+}
+
+/**
+ * The most basic layout. NullLayout's format() methods performs no formatting at all and simply returns the message logged.
+ */
+export class NullLayout extends Layout {
+ /**
+ * Constructor
+ */
+ constructor();
+}
+
+/**
+ * Provides basic formatting. SimpleLayout consists of the level of the log statement, followed by " - " and then the log message
+ * itself. For example, "DEBUG - Hello world".
+ */
+export class SimpleLayout extends Layout {
+ /**
+ * Constructor
+ */
+ constructor();
+}
+
+/**
+ * Provides a flexible way of formatting a log message by means of a conversion pattern string. The behaviour of this layout is a
+ * full implementation of PatternLayout in log4j, with the exception of the set of conversion characters - log4javascript's is
+ * necessarily a subset of that of log4j with a few additions of its own, since many of the conversion characters in log4j only
+ * make sense in the context of Java.
+ * The conversion pattern consists of literal text interspersed with special strings starting with a % symbol called conversion
+ * specifiers. A conversion specifier consists of the % symbol, a conversion character (possible characters are listed below) and
+ * format modifiers. For full documentation of the conversion pattern, see log4j's documentation.
+ */
+export class PatternLayout extends Layout {
+ /**
+ * Built-in conversion pattern, equivalent to %r %p %c - %m%n.
+ */
+ static TTCC_CONVERSION_PATTERN: string;
+
+ /**
+ * Built-in conversion pattern, equivalent to %m%n.
+ */
+ static DEFAULT_CONVERSION_PATTERN: string;
+
+ /**
+ * Built-in date format (and also the default), equivalent to yyyy-MM-dd HH:mm:ss,SSS.
+ */
+ static ISO8601_DATEFORMAT: string;
+
+ /**
+ * Built-in date format, equivalent to dd MMM YYYY HH:mm:ss,SSS.
+ */
+ static DATETIME_DATEFORMAT: string;
+
+ /**
+ * Built-in date format, equivalent to HH:mm:ss,SSS.
+ */
+ static ABSOLUTETIME_DATEFORMAT: string;
+
+ /**
+ * Constructor
+ * @param pattern The conversion pattern string to use.
+ */
+ constructor(pattern: string);
+}
+
+/**
+ * Based on log4j's XmlLayout, this layout formats a log message as a fragment of XML.
+ */
+export class XmlLayout extends Layout {
+ /**
+ * Constructor
+ * @param combineMessages Whether or not to format multiple log messages as a combined single
+ * element composed of each individual message separated by line breaks or to include a element for
+ * each message inside one element. If not specified, defaults to true.
+ */
+ constructor(combineMessages?: boolean);
+}
+
+/**
+ * Formats a logging event into JavaScript Object Notation (JSON). JSON is a subset of JavaScript's object literal syntax,
+ * meaning that log messages formatted with this layout can be interpreted directly by JavaScript and converted into objects.
+ * See json.org for more details about JSON.
+ */
+export class JsonLayout extends Layout {
+ /**
+ * Constructor
+ * @param readable Whether or not to format each log message with line breaks and tabs. If not specified, defaults to false.
+ * @param combineMessages Whether or not to format multiple log messages as a combined single message property composed of
+ * each individual message separated by line breaks or to format multiple messages as an array. If not specified, defaults to true.
+ */
+ constructor(readable?: boolean, combineMessages?: boolean);
+
+ /**
+ * Returns whether or not to each log message is formatted with line breaks and tabs.
+ */
+ isReadable(): boolean;
+}
+
+/**
+ * Formats the log message as a simple URL-encoded string from which a simple server-side script may extract parameters such as
+ * the log message, severity and timestamp. This is the default layout for AjaxAppender.
+ */
+export class HttpPostDataLayout extends Layout {
+ /**
+ * Constructor
+ */
+ constructor();
+}
+
+// #endregion
+
+// #region log4javascript error handling
+
+/**
+ * log4javascript has a single rudimentary logger-like object of its own to handle messages generated by log4javascript itself.
+ * This logger is called logLog and is accessed via log4javascript.logLog.
+ */
+export namespace logLog {
+
+ /**
+ * Sets whether logLog is in quiet mode or not. In quiet mode, no messages sent to logLog have any visible effect. By default,
+ * quiet mode is switched off.
+ * @param quietMode Whether to turn quiet mode on or off.
+ */
+ export function setQuietMode(quietMode: boolean): void;
+
+ /**
+ * Sets how many errors logLog will display alerts for. By default, only the first error encountered generates an alert to the
+ * user. If you turn all errors on by supplying true to this method then all errors will generate alerts.
+ * @param showAllErrors Whether to show all errors or just the first.
+ */
+ export function setAlertAllErrors(alertAllErrors: boolean): void;
+
+ /**
+ * Logs a debugging message to an in-memory list.
+ */
+ export function debug(message: string, exception?: Error): void;
+
+ /**
+ * Displays an alert of all debugging messages.
+ */
+ export function displayDebug(): void;
+
+ /**
+ * Currently has no effect.
+ */
+ export function warn(message: string, exception?: Error): void;
+
+ /**
+ * Generates an alert to the user if and only if the error is the first one encountered and setAlertAllErrors(true) has not been called.
+ */
+ export function error(message: string, exception?: Error): void;
+
+}
+
+// #endregion
\ No newline at end of file
diff --git a/package.json b/package.json
index 9e40535..fff96d7 100644
--- a/package.json
+++ b/package.json
@@ -1,22 +1,23 @@
{
- "name" : "log4javascript",
- "title" : "log4javascript",
- "version" : "1.4.13",
- "author" : {
- "name" : "Tim Down",
- "email" : "tim@log4javascript.org",
+ "name": "log4javascript",
+ "title": "log4javascript",
+ "version": "1.4.13-1",
+ "author": {
+ "name": "Tim Down",
+ "email": "tim@log4javascript.org",
"homepage": "http://log4javascript.org/"
},
"main": "./log4javascript.js",
- "description" : "log4javascript",
- "keywords" : [
+ "description": "log4javascript",
+ "keywords": [
"log4javascript",
"logging",
"js",
"json"
],
- "repository" : {
+ "repository": {
"type": "git",
- "url" : "https://github.com/Ritzlgrmft/log4javascript.git"
- }
+ "url": "https://github.com/Ritzlgrmft/log4javascript.git"
+ },
+ "typings": "log4javascript.d.ts"
}
From a843a6659c4fc7ba911f98e19fc9245243ed7bc9 Mon Sep 17 00:00:00 2001
From: Ritzlgrmft
Date: Fri, 6 May 2016 17:28:26 +0200
Subject: [PATCH 3/5] Version increased to 1.4.14
---
README.md | 5 ++++-
package.json | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 54105a4..79f9d1d 100644
--- a/README.md
+++ b/README.md
@@ -3,4 +3,7 @@ log4javascript
http://log4javascript.org
-It contains the log4javascript lib prepared to be used with npm
+It contains the log4javascript lib prepared to be used with npm.
+
+Unfortunately, the npm package 1.4.14 still contains log4javascript 1.4.13.
+It was necessary to increase the version since the new package contains also TypeScript definitions.
diff --git a/package.json b/package.json
index fff96d7..3c23ebd 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "log4javascript",
"title": "log4javascript",
- "version": "1.4.13-1",
+ "version": "1.4.14",
"author": {
"name": "Tim Down",
"email": "tim@log4javascript.org",
From 8aade2bcfe4302058aa25a111890b129995d4c6b Mon Sep 17 00:00:00 2001
From: Ritzlgrmft
Date: Fri, 13 May 2016 11:14:16 +0200
Subject: [PATCH 4/5] getEffectiveAppenders() added to TypeScript definition
version increased
---
README.md | 2 +-
log4javascript.d.ts | 9 ++++++---
package.json | 2 +-
3 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index 79f9d1d..ddb9f65 100644
--- a/README.md
+++ b/README.md
@@ -5,5 +5,5 @@ http://log4javascript.org
It contains the log4javascript lib prepared to be used with npm.
-Unfortunately, the npm package 1.4.14 still contains log4javascript 1.4.13.
+Unfortunately, the npm package 1.4.15 still contains log4javascript 1.4.13.
It was necessary to increase the version since the new package contains also TypeScript definitions.
diff --git a/log4javascript.d.ts b/log4javascript.d.ts
index c305bb5..7697ded 100644
--- a/log4javascript.d.ts
+++ b/log4javascript.d.ts
@@ -1,6 +1,4 @@
-// Generated by typings
-// Source: https://raw.githubusercontent.com/DefinitelyTyped/DefinitelyTyped/2d448c0a3152e8871521848c5c2c61ab4e2a2cc9/log4javascript/log4javascript.d.ts
-// Type definitions for log4javascript v1.4.10
+// Type definitions for log4javascript v1.4.13
// Project: http://log4javascript.org/
// Definitions by: Markus Wagner
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
@@ -126,6 +124,11 @@ export class Logger {
*/
removeAllAppenders(): void;
+ /**
+ * Returns all appenders which will log a message.
+ */
+ getEffectiveAppenders(): Appender[];
+
/**
* Sets the level. Log messages of a lower level than level will not be logged. Default value is DEBUG.
*/
diff --git a/package.json b/package.json
index 3c23ebd..08738d9 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "log4javascript",
"title": "log4javascript",
- "version": "1.4.14",
+ "version": "1.4.15",
"author": {
"name": "Tim Down",
"email": "tim@log4javascript.org",
From d27efb927c3c47ce9d747263427905d16ded2f2c Mon Sep 17 00:00:00 2001
From: Markus Wagner
Date: Sun, 6 Dec 2020 14:39:27 +0100
Subject: [PATCH 5/5] improve typescript definitions
---
README.md | 19 ++++++++++++++-----
log4javascript.d.ts | 8 +++++++-
package.json | 4 ++--
3 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
index ddb9f65..4ad498a 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,18 @@
-log4javascript
-==============
+# log4javascript
-http://log4javascript.org
+
It contains the log4javascript lib prepared to be used with npm.
-Unfortunately, the npm package 1.4.15 still contains log4javascript 1.4.13.
-It was necessary to increase the version since the new package contains also TypeScript definitions.
+Unfortunately, the npm package 1.4.16 still contains log4javascript 1.4.13.
+It was necessary to increase the version since the new package contains also TypeScript definitions.
+
+## Changes
+
+1.4.16 (6-Dec-2020)
+
+- improve typescript definitions
+
+1.4.15 (13-May-2016)
+
+- add typescript definitions
diff --git a/log4javascript.d.ts b/log4javascript.d.ts
index 7697ded..e8bc38e 100644
--- a/log4javascript.d.ts
+++ b/log4javascript.d.ts
@@ -128,7 +128,7 @@ export class Logger {
* Returns all appenders which will log a message.
*/
getEffectiveAppenders(): Appender[];
-
+
/**
* Sets the level. Log messages of a lower level than level will not be logged. Default value is DEBUG.
*/
@@ -1038,6 +1038,12 @@ export class JsonLayout extends Layout {
* Returns whether or not to each log message is formatted with line breaks and tabs.
*/
isReadable(): boolean;
+
+ /**
+ * Returns whether or not to format multiple log messages as a combined single message property composed of each individual
+ * message separated by line breaks or to format multiple messages as an array. If not specified, defaults to true.
+ */
+ isCombinedMessages(): boolean;
}
/**
diff --git a/package.json b/package.json
index 08738d9..7c89f64 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "log4javascript",
"title": "log4javascript",
- "version": "1.4.15",
+ "version": "1.4.16",
"author": {
"name": "Tim Down",
"email": "tim@log4javascript.org",
@@ -20,4 +20,4 @@
"url": "https://github.com/Ritzlgrmft/log4javascript.git"
},
"typings": "log4javascript.d.ts"
-}
+}
\ No newline at end of file