From 6368de109425828c267b3411fe7e51be40e6af7c Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Wed, 5 Jun 2013 08:02:10 +1000 Subject: [PATCH] refactored pattern layout --- lib/layouts.js | 217 ++++++++++++++++++++++++++++--------------------- 1 file changed, 125 insertions(+), 92 deletions(-) diff --git a/lib/layouts.js b/lib/layouts.js index 5ab02a2..d5971d1 100644 --- a/lib/layouts.js +++ b/lib/layouts.js @@ -169,6 +169,125 @@ function patternLayout (pattern, tokens) { var regex = /%(-?[0-9]+)?(\.?[0-9]+)?([\[\]cdmnprx%])(\{([^\}]+)\})?|([^%]+)/; pattern = pattern || TTCC_CONVERSION_PATTERN; + + function categoryName(loggingEvent, specifier) { + var loggerName = loggingEvent.categoryName; + if (specifier) { + var precision = parseInt(specifier, 10); + var loggerNameBits = loggerName.split("."); + if (precision < loggerNameBits.length) { + loggerName = loggerNameBits.slice(loggerNameBits.length - precision).join("."); + } + } + return loggerName; + } + + function formatAsDate(loggingEvent, specifier) { + var format = dateFormat.ISO8601_FORMAT; + if (specifier) { + format = specifier; + // Pick up special cases + if (format == "ISO8601") { + format = dateFormat.ISO8601_FORMAT; + } else if (format == "ABSOLUTE") { + format = dateFormat.ABSOLUTETIME_FORMAT; + } else if (format == "DATE") { + format = dateFormat.DATETIME_FORMAT; + } + } + // Format the date + return dateFormat.asString(format, loggingEvent.startTime); + } + + function formatMessage(loggingEvent) { + return formatLogData(loggingEvent.data); + } + + function endOfLine() { + return eol; + } + + function logLevel(loggingEvent) { + return loggingEvent.level.toString(); + } + + function startTime(loggingEvent) { + return "" + loggingEvent.startTime.toLocaleTimeString(); + } + + function startColour(loggingEvent) { + return colorizeStart(colours[loggingEvent.level.toString()]); + } + + function endColour(loggingEvent) { + return colorizeEnd(colours[loggingEvent.level.toString()]); + } + + function percent() { + return '%'; + } + + function userDefined(loggingEvent, specifier) { + if (typeof(tokens[specifier]) !== 'undefined') { + if (typeof(tokens[specifier]) === 'function') { + return tokens[specifier](loggingEvent); + } else { + return tokens[specifier]; + } + } + return null; + } + + var replacers = { + 'c': categoryName, + 'd': formatAsDate, + 'm': formatMessage, + 'n': endOfLine, + 'p': logLevel, + 'r': startTime, + '[': startColour, + ']': endColour, + '%': percent, + 'x': userDefined + }; + + function replaceToken(conversionCharacter, loggingEvent, specifier) { + var replacer = replacers[conversionCharacter]; + if (replacer) { + return replacer(loggingEvent, specifier); + } + return null; + } + + function truncate(truncation, toTruncate) { + var len; + if (truncation) { + len = parseInt(truncation.substr(1), 10); + return toTruncate.substring(0, len); + } + + return toTruncate; + } + + function pad(padding, toPad) { + var len; + if (padding) { + if (padding.charAt(0) == "-") { + len = parseInt(padding.substr(1), 10); + // Right pad with spaces + while (toPad.length < len) { + toPad += " "; + } + } else { + len = parseInt(padding, 10); + // Left pad with spaces + while (toPad.length < len) { + toPad = " " + toPad; + } + } + } + return toPad; + } return function(loggingEvent) { var formattedString = ""; @@ -189,100 +308,14 @@ function patternLayout (pattern, tokens) { } else { // Create a raw replacement string based on the conversion // character and specifier - var replacement = ""; - switch(conversionCharacter) { - case "c": - var loggerName = loggingEvent.categoryName; - if (specifier) { - var precision = parseInt(specifier, 10); - var loggerNameBits = loggingEvent.categoryName.split("."); - if (precision >= loggerNameBits.length) { - replacement = loggerName; - } else { - replacement = loggerNameBits.slice(loggerNameBits.length - precision).join("."); - } - } else { - replacement = loggerName; - } - break; - case "d": - var format = dateFormat.ISO8601_FORMAT; - if (specifier) { - format = specifier; - // Pick up special cases - if (format == "ISO8601") { - format = dateFormat.ISO8601_FORMAT; - } else if (format == "ABSOLUTE") { - format = dateFormat.ABSOLUTETIME_FORMAT; - } else if (format == "DATE") { - format = dateFormat.DATETIME_FORMAT; - } - } - // Format the date - replacement = dateFormat.asString(format, loggingEvent.startTime); - break; - case "m": - replacement = formatLogData(loggingEvent.data); - break; - case "n": - replacement = eol; - break; - case "p": - replacement = loggingEvent.level.toString(); - break; - case "r": - replacement = "" + loggingEvent.startTime.toLocaleTimeString(); - break; - case "[": - replacement = colorizeStart(colours[loggingEvent.level.toString()]); - break; - case "]": - replacement = colorizeEnd(colours[loggingEvent.level.toString()]); - break; - case "%": - replacement = "%"; - break; - case "x": - if(typeof(tokens[specifier]) !== 'undefined') { - if(typeof(tokens[specifier]) === 'function') { - replacement = tokens[specifier](); - } else { - replacement = tokens[specifier]; - } - } else { - replacement = matchedString; - } - break; - default: - replacement = matchedString; - break; - } + var replacement = + replaceToken(conversionCharacter, loggingEvent, specifier) || + matchedString; + // Format the replacement according to any padding or // truncation specified - - var len; - - // First, truncation - if (truncation) { - len = parseInt(truncation.substr(1), 10); - replacement = replacement.substring(0, len); - } - // Next, padding - if (padding) { - if (padding.charAt(0) == "-") { - len = parseInt(padding.substr(1), 10); - // Right pad with spaces - while (replacement.length < len) { - replacement += " "; - } - } else { - len = parseInt(padding, 10); - // Left pad with spaces - while (replacement.length < len) { - replacement = " " + replacement; - } - } - } + replacement = truncate(truncation, replacement); + replacement = pad(padding, replacement); formattedString += replacement; } searchString = searchString.substr(result.index + result[0].length);