From e4bf405f201a0a63865171ca0232b3a5bcc3dcf1 Mon Sep 17 00:00:00 2001 From: Jan Schmidle Date: Fri, 8 Feb 2013 14:54:18 +0100 Subject: [PATCH 1/5] add your own tokens to the patternLayout --- lib/layouts.js | 20 ++++++++++++++++---- test/layouts-test.js | 27 ++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/lib/layouts.js b/lib/layouts.js index 320d12c..dc6c2dd 100644 --- a/lib/layouts.js +++ b/lib/layouts.js @@ -10,8 +10,9 @@ var dateFormat = require('./date_format') , "coloured": function() { return colouredLayout; } , "pattern": function (config) { var pattern = config.pattern || undefined; - return patternLayout(pattern); - } + var tokens = config.tokens || undefined; + return patternLayout(pattern, tokens); + } } , colours = { ALL: "grey" @@ -143,9 +144,9 @@ function messagePassThroughLayout (loggingEvent) { * Takes a pattern string and returns a layout function. * @author Stephan Strittmatter */ -function patternLayout (pattern) { +function patternLayout (pattern, tokens) { var TTCC_CONVERSION_PATTERN = "%r %p %c - %m%n"; - var regex = /%(-?[0-9]+)?(\.?[0-9]+)?([\[\]cdmnpr%])(\{([^\}]+)\})?|([^%]+)/; + var regex = /%(-?[0-9]+)?(\.?[0-9]+)?([\[\]cdmnprx%])(\{([^\}]+)\})?|([^%]+)/; pattern = pattern || TTCC_CONVERSION_PATTERN; @@ -221,6 +222,17 @@ function patternLayout (pattern) { case "%": replacement = "%"; break; + case "x": + if(tokens[specifier]) { + if(typeof(tokens[specifier]) === 'function') { + replacement = tokens[specifier](); + } else { + replacement = tokens[specifier]; + } + } else { + replacement = matchedString; + } + break; default: replacement = matchedString; break; diff --git a/test/layouts-test.js b/test/layouts-test.js index 105fd1c..52c9811 100644 --- a/test/layouts-test.js +++ b/test/layouts-test.js @@ -4,9 +4,10 @@ assert = require('assert'); //used for patternLayout tests. function test(args, pattern, value) { var layout = args[0] - , event = args[1]; + , event = args[1] + , tokens = args[2]; - assert.equal(layout(pattern)(event), value); + assert.equal(layout(pattern, tokens)(event), value); } vows.describe('log4js layouts').addBatch({ @@ -175,8 +176,12 @@ vows.describe('log4js layouts').addBatch({ level: { toString: function() { return "DEBUG"; } } - }, layout = require('../lib/layouts').patternLayout; - return [layout, event]; + }, layout = require('../lib/layouts').patternLayout + , tokens = { + testString: 'testStringToken', + testFunction: function() { return 'testFunctionToken'; } + }; + return [layout, event, tokens]; }, 'should default to "time logLevel loggerName - message"': function(args) { @@ -246,6 +251,18 @@ vows.describe('log4js layouts').addBatch({ }, '%[%r%] should output colored time': function(args) { test(args, '%[%r%]', '\033[36m14:18:30\033[39m'); - } + }, + '%x{testString} should output the string stored in tokens': function(args) { + test(args, '%x{testString}', 'testStringToken'); + }, + '%x{testFunction} should output the result of the function stored in tokens': function(args) { + test(args, '%x{testFunction}', 'testFunctionToken'); + }, + '%x{doesNotExist} should output the string stored in tokens': function(args) { + test(args, '%x{doesNotExist}', '%x{doesNotExist}'); + }, + '%x should output the string stored in tokens': function(args) { + test(args, '%x', '%x'); + }, } }).export(module); From bec0d058470263f957def32c07cbd35076edf0f3 Mon Sep 17 00:00:00 2001 From: Jan Schmidle Date: Fri, 8 Feb 2013 16:15:51 +0100 Subject: [PATCH 2/5] added some documentation to the function header --- lib/layouts.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/layouts.js b/lib/layouts.js index dc6c2dd..aed65b8 100644 --- a/lib/layouts.js +++ b/lib/layouts.js @@ -140,9 +140,22 @@ function messagePassThroughLayout (loggingEvent) { * - %d date in various formats * - %% % * - %n newline + * - %x{} add dynamic tokens to your log. Tokens are specified in the tokens parameter * You can use %[ and %] to define a colored block. - * Takes a pattern string and returns a layout function. + * + * Tokens are specified as simple key:value objects. + * The key represents the token name whereas the value can be a string or function + * which is called to extract the value to put in the log message. If token is not + * found, it doesn't replace the field. + * + * A sample token would be: { "pid" : function() { return process.pid; } } + * + * Takes a pattern string, array of tokens and returns a layout function. + * @param {String} Log format pattern String + * @param {object} map object of different tokens + * @return {Function} * @author Stephan Strittmatter + * @author Jan Schmidle */ function patternLayout (pattern, tokens) { var TTCC_CONVERSION_PATTERN = "%r %p %c - %m%n"; From 5c75ba9468b36af668f1af439cbd546461ed098f Mon Sep 17 00:00:00 2001 From: Jan Schmidle Date: Fri, 8 Feb 2013 16:17:24 +0100 Subject: [PATCH 3/5] fixed small issue that could occur with wrong evaluated parameters --- lib/layouts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/layouts.js b/lib/layouts.js index aed65b8..931fc48 100644 --- a/lib/layouts.js +++ b/lib/layouts.js @@ -236,7 +236,7 @@ function patternLayout (pattern, tokens) { replacement = "%"; break; case "x": - if(tokens[specifier]) { + if(typeof(tokens[specifier]) !== 'undefined') { if(typeof(tokens[specifier]) === 'function') { replacement = tokens[specifier](); } else { From af428c5669470b00f95df04da28a000536d591b3 Mon Sep 17 00:00:00 2001 From: Jan Schmidle Date: Fri, 8 Feb 2013 16:18:27 +0100 Subject: [PATCH 4/5] added example on pattern tokens usage --- examples/patternLayout-tokens.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 examples/patternLayout-tokens.js diff --git a/examples/patternLayout-tokens.js b/examples/patternLayout-tokens.js new file mode 100644 index 0000000..18cd6f7 --- /dev/null +++ b/examples/patternLayout-tokens.js @@ -0,0 +1,21 @@ +var log4js = require("log4js"); + +var config = { + "appenders": [ + { + "type": "console", + "layout": { + "type": "pattern", + "pattern": "%[%r (%x{pid}) %p %c -%] %m%n", + "tokens": { + "pid" : function() { return process.pid; } + } + } + } + ] + }; + +log4js.configure(config, {}); + +var logger = log4js.getLogger("app"); +logger.info("Test log message"); \ No newline at end of file From a3bdac8e14024216613e6aa84bc2e91c9d15693f Mon Sep 17 00:00:00 2001 From: Jan Schmidle Date: Fri, 8 Feb 2013 16:22:29 +0100 Subject: [PATCH 5/5] updated require in example to match other examles --- examples/patternLayout-tokens.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/patternLayout-tokens.js b/examples/patternLayout-tokens.js index 18cd6f7..84b171c 100644 --- a/examples/patternLayout-tokens.js +++ b/examples/patternLayout-tokens.js @@ -1,4 +1,4 @@ -var log4js = require("log4js"); +var log4js = require('./lib/log4js'); var config = { "appenders": [