From 15e9a30d05d83ac5fe0557f672e19ae12e0b6a15 Mon Sep 17 00:00:00 2001 From: csausdev Date: Tue, 19 Jan 2010 22:26:54 +1100 Subject: [PATCH] Added logLevelFilter --- lib/log4js-node.js | 41 +++++++++++++------ spec/fixtures/with-logLevelFilter.json | 28 +++++++++++++ spec/spec.logging.js | 56 +++++++++++++++++++++----- 3 files changed, 104 insertions(+), 21 deletions(-) create mode 100644 spec/fixtures/with-logLevelFilter.json diff --git a/lib/log4js-node.js b/lib/log4js-node.js index 37f87e2..b34f062 100644 --- a/lib/log4js-node.js +++ b/lib/log4js-node.js @@ -184,6 +184,10 @@ var appenderMakers = { layout = layoutMakers[config.layout.type](config.layout); } return consoleAppender(layout); + }, + "logLevelFilter": function(config) { + var appender = appenderMakers[config.appender.type](config.appender); + return logLevelFilter(config.level, appender); } }; @@ -196,15 +200,20 @@ var layoutMakers = { } }; +function configureAppender(appenderConfig) { +} + function configureAppenders(appenderList) { log4js.clearAppenders(); if (appenderList) { - appenderList.forEach( - function(appenderConfig) { - var appender = appenderMakers[appenderConfig.type](appenderConfig); - log4js.addAppender(appender, appenderConfig.category); + appenderList.forEach(function(appenderConfig) { + var appender = appenderMakers[appenderConfig.type](appenderConfig); + if (appender) { + log4js.addAppender(appender, appenderConfig.category); + } else { + throw new Error("log4js configuration problem for "+sys.inspect(appenderConfig)); } - ); + }); } else { log4js.addAppender(consoleAppender); } @@ -263,6 +272,10 @@ Level.prototype.isLessThanOrEqualTo = function(otherLevel) { return this.level <= otherLevel.level; }; +Level.prototype.isGreaterThanOrEqualTo = function(otherLevel) { + return this.level >= otherLevel.level; +}; + /** * Models a logging event. * @constructor @@ -369,15 +382,9 @@ consoleAppender = function (layout) { fileAppender = function(file, layout) { layout = layout || basicLayout; file = file || "log4js.log"; - var logFile; //waits are generally bad, but we need //the file to be open before we start doing any writing. - posix - .open(file, process.O_APPEND | process.O_WRONLY | process.O_CREAT, 0644) - .addCallback(function(fileDescriptor) { logFile = fileDescriptor; }) - .addErrback(function(err) { throw new Error("Could not open logfile "+file+", error was: "+sys.inspect(err)); }) - .wait(); - + var logFile = posix.open(file, process.O_APPEND | process.O_WRONLY | process.O_CREAT, 0644).wait(); //register ourselves as listeners for shutdown //so that we can close the file. //not entirely sure this is necessary, but still. @@ -388,6 +395,15 @@ fileAppender = function(file, layout) { }; }; +logLevelFilter = function(levelString, appender) { + var level = Level.toLevel(levelString); + return function(logEvent) { + if (logEvent.level.isGreaterThanOrEqualTo(level)) { + appender(logEvent); + } + } +}; + /** * BasicLayout is a simple layout for storing the logs. The logs are stored * in following format: @@ -596,6 +612,7 @@ Date.prototype.toFormattedString = function(format) { log4js.consoleAppender = consoleAppender; log4js.fileAppender = fileAppender; +log4js.logLevelFilter = logLevelFilter; log4js.basicLayout = basicLayout; log4js.patternLayout = patternLayout; log4js.messagePassThroughLayout = messagePassThroughLayout; diff --git a/spec/fixtures/with-logLevelFilter.json b/spec/fixtures/with-logLevelFilter.json new file mode 100644 index 0000000..1c36614 --- /dev/null +++ b/spec/fixtures/with-logLevelFilter.json @@ -0,0 +1,28 @@ +{ + appenders: [ + { + category: "tests", + type: "logLevelFilter", + level: "WARN", + appender: { + type: "file", + filename: "tmp-tests-warnings.log", + layout: { + type: "messagePassThrough" + } + } + }, + { + category: "tests", + type: "file", + filename: "tmp-tests.log", + layout: { + type: "messagePassThrough" + } + } + ], + + levels: { + "tests": "DEBUG" + } +} diff --git a/spec/spec.logging.js b/spec/spec.logging.js index fc37abd..e49296d 100644 --- a/spec/spec.logging.js +++ b/spec/spec.logging.js @@ -1,19 +1,18 @@ posix = require('posix'); -waitForWriteAndThenRead = function(filename) { +waitForWriteAndThenRead = function (filename) { //here's the tricky part - writes are asynchronous //so I'm going to make a promise, wait a bit and then //try to read the file. var content, promise = new process.Promise(); + promise.addCallback(function() { + content = posix.cat(filename).timeout(500).wait(); + }); setTimeout(function() { promise.emitSuccess(); - }, 50); - promise.addCallback(function() { - posix.cat(filename).addCallback( - function(fileContents) { content = fileContents; } - ).wait(); - }).wait(); - + }, 0); + + promise.wait(); return content; } @@ -161,14 +160,40 @@ describe 'log4js' end end + describe 'logLevelFilter' + + it 'should only pass log events greater than or equal to its own level' + var logEvent; + log4js.addAppender(log4js.logLevelFilter('ERROR', function(evt) { logEvent = evt; })); + logger.debug('this should not trigger an event'); + logEvent.should.be undefined + + logger.warn('neither should this'); + logEvent.should.be undefined + + logger.error('this should, though'); + logEvent.should.not.be undefined + logEvent.message.should.be 'this should, though' + + logger.fatal('so should this') + logEvent.message.should.be 'so should this' + end + + end + describe 'configure' - before + before_each log4js.clearAppenders(); try { posix.unlink('./tmp-tests.log').wait(); } catch(e) { print('Could not delete tmp-tests.log: '+e.message); } + try { + posix.unlink('./tmp-tests-warnings.log').wait(); + } catch (e) { + print('Could not delete tmp-tests-warnings.log: '+e.message); + } end it 'should load appender configuration from a json file' @@ -184,6 +209,19 @@ describe 'log4js' event.message.should.be 'this should fire an event' waitForWriteAndThenRead('./tmp-tests.log').should.be 'this should fire an event\n' end + + it 'should handle logLevelFilter configuration' + log4js.configure('spec/fixtures/with-logLevelFilter.json'); + event = undefined; + + logger.info('main'); + logger.error('both'); + logger.warn('both'); + logger.debug('main'); + + waitForWriteAndThenRead('./tmp-tests.log').should.be 'main\nboth\nboth\nmain\n' + waitForWriteAndThenRead('./tmp-tests-warnings.log').should.be 'both\nboth\n' + end end end