From 3b77a4270641aae6318dcb91c0a5d577db341f9e Mon Sep 17 00:00:00 2001 From: Danny Brain Date: Thu, 27 Oct 2011 12:38:13 +1100 Subject: [PATCH 01/10] Added a hookio appender, this allows you to run a 'master' log4js instance and 'worker' so only one process writes to file --- lib/appenders/hookio.js | 55 +++++++++++++++++++++++++++++++++++++++++ lib/log4js.js | 13 +++++----- package.json | 11 ++++++--- 3 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 lib/appenders/hookio.js diff --git a/lib/appenders/hookio.js b/lib/appenders/hookio.js new file mode 100644 index 0000000..44f5c06 --- /dev/null +++ b/lib/appenders/hookio.js @@ -0,0 +1,55 @@ +var log4js = require('../log4js'); +var layouts = require('../layouts'); +var Hook = require('hook.io').Hook; +var util = require('util'); + +var Logger = function createLogger(options) { + var self = this; + var actualAppender = options.actualAppender; + Hook.call(self, options); + self.on('hook::ready', function hookReady() { + self.on('*::' + options.name + '::log', function log(loggingEvent) { + deserializeLoggingEvent(loggingEvent); + actualAppender(loggingEvent); + }); + }); +} +util.inherits(Logger, Hook); + +function deserializeLoggingEvent(loggingEvent) { + loggingEvent.startTime = new Date(loggingEvent.startTime); + loggingEvent.level.toString = function levelToString() { + return loggingEvent.level.levelStr; + }; +} + +function createAppender(hookioOptions, actualAppender) { + var loggerHook; + if (hookioOptions.mode === 'master') { + // Start the master hook, handling the actual logging + loggerHook = new Logger({ name: hookioOptions.name, debug: hookioOptions.debug, actualAppender: actualAppender }); + } else { + // Start a worker, just emitting events for a master + loggerHook = new Hook({ name: hookioOptions.name, debug: hookioOptions.debug }); + } + loggerHook.start(); + + var loggerEvent = hookioOptions.name + '::log'; + return function log(loggingEvent) { + loggerHook.emit(loggerEvent, loggingEvent); + }; +} + +function configure(config) { + var actualAppender; + if (config.appender && config.mode === 'master') { + actualAppender = log4js.appenderMakers[config.appender.type](config.appender); + } + delete config.appender; + delete config.type; + return createAppender(config, actualAppender); +} + +exports.name = 'hookio'; +exports.appender = createAppender; +exports.configure = configure; diff --git a/lib/log4js.js b/lib/log4js.js index 11f4811..2eea7a9 100644 --- a/lib/log4js.js +++ b/lib/log4js.js @@ -248,13 +248,13 @@ function getDefaultLogger () { return getLogger(DEFAULT_CATEGORY); } -function findConfiguration() { +function findConfiguration(filename) { var path; try { - path = require.resolve('log4js.json'); + path = require.resolve(filename || 'log4js.json'); } catch (e) { //file not found. default to the one in the log4js module. - path = __dirname + '/log4js.json'; + path = filename || __dirname + '/log4js.json'; } return path; @@ -263,8 +263,8 @@ function findConfiguration() { var configState = {}; function loadConfigurationFile(filename) { - filename = filename || findConfiguration(); - if (filename && (!configState.lastFilename || filename !== configState.lastFilename || + filename = findConfiguration(filename); + if (filename && (!configState.lastFilename || filename !== configState.lastFilename || !configState.lastMTime || fs.statSync(filename).mtime !== configState.lastMTime)) { configState.lastFilename = filename; configState.lastMTime = fs.statSync(filename).mtime; @@ -285,7 +285,7 @@ function configureOnceOff(config) { } function reloadConfiguration() { - var filename = configState.filename || findConfiguration(), + var filename = findConfiguration(configState.filename), mtime; if (!filename) { // can't find anything to reload @@ -371,6 +371,7 @@ module.exports = { layouts: layouts, appenders: {}, + appenderMakers: appenderMakers, connectLogger: require('./connect-logger').connectLogger }; diff --git a/package.json b/package.json index c4ce49d..7487e3b 100644 --- a/package.json +++ b/package.json @@ -6,23 +6,26 @@ "logging", "log", "log4j", - "node" + "node" ], "main": "./lib/log4js", "author": "Gareth Jones ", "bugs": { - "web": "http://github.com/csausdev/log4js-node/issues" + "web": "http://github.com/csausdev/log4js-node/issues" }, "engines": [ "node >=0.4" ], "scripts": { - "test": "vows test/*.js" + "test": "vows test/*.js" }, "directories": { "test": "test", "lib": "lib" }, + "dependencies": { + "hook.io": "0.7.7" + }, "devDependencies": { "vows": ">=0.5.2", "sandboxed-module": ">= 0.1.1" - } + } } From f82ecf8f2a1337a314f9842acaea9c7d2fe85d64 Mon Sep 17 00:00:00 2001 From: Danny Brain Date: Thu, 27 Oct 2011 13:12:36 +1100 Subject: [PATCH 02/10] Update readme to describe hook.io usage --- README.md | 86 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 71 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 412d950..3bb239c 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ NOTE: v0.3.8 of log4js is the last that will work with node versions older than 0.4. To use v0.3.9 you will need node 0.4 or later. -This is a conversion of the [log4js](http://log4js.berlios.de/index.html) +This is a conversion of the [log4js](http://log4js.berlios.de/index.html) framework to work with [node](http://nodejs.org). I've mainly stripped out the browser-specific code -and tidied up some of the javascript. It includes a basic file logger, with log rolling based on file size, and also replaces node's console.log functions. +and tidied up some of the javascript. It includes a basic file logger, with log rolling based on file size, and also replaces node's console.log functions. NOTE: in v0.2.x require('log4js') returned a function, and you needed to call that function in your code before you could use it. This was to make testing easier. v0.3.x make use of [felixge's sandbox-module](https://github.com/felixge/node-sandboxed-module), so we don't need to return a function. @@ -14,7 +14,7 @@ npm install log4js ## tests -Tests now use [vows](http://vowsjs.org), run with `vows test/*.js`. +Tests now use [vows](http://vowsjs.org), run with `vows test/*.js`. ## usage @@ -33,27 +33,27 @@ See example.js: var log4js = require('log4js'); //note the need to call the function log4js.addAppender(log4js.consoleAppender()); log4js.addAppender(log4js.fileAppender('logs/cheese.log'), 'cheese'); - + var logger = log4js.getLogger('cheese'); logger.setLevel('ERROR'); - + logger.trace('Entering cheese testing'); logger.debug('Got cheese.'); - logger.info('Cheese is Gouda.'); + logger.info('Cheese is Gouda.'); logger.warn('Cheese is quite smelly.'); logger.error('Cheese is too ripe!'); logger.fatal('Cheese was breeding ground for listeria.'); - + Output: [2010-01-17 11:43:37.987] [ERROR] cheese - Cheese is too ripe! [2010-01-17 11:43:37.990] [FATAL] cheese - Cheese was breeding ground for listeria. - + ## configuration -You can either configure the appenders and log levels manually (as above), or provide a -configuration file (`log4js.configure('path/to/file.json')`) explicitly, or just let log4js look for a file called `log4js.json` (it looks in the current directory first, then the require paths, and finally looks for the default config included in the same directory as the `log4js.js` file). +You can either configure the appenders and log levels manually (as above), or provide a +configuration file (`log4js.configure('path/to/file.json')`) explicitly, or just let log4js look for a file called `log4js.json` (it looks in the current directory first, then the require paths, and finally looks for the default config included in the same directory as the `log4js.js` file). An example file can be found in `test/log4js.json`. An example config file with log rolling is in `test/with-log-rolling.json`. By default, the configuration file is checked for changes every 60 seconds, and if changed, reloaded. This allows changes to logging levels to occur without restarting the application. @@ -75,16 +75,16 @@ You can also pass an object to the configure function, which has the same proper ## connect/express logger -A connect/express logger has been added to log4js, by [danbell](https://github.com/danbell). This allows connect/express servers to log using log4js. See example-connect-logger.js. +A connect/express logger has been added to log4js, by [danbell](https://github.com/danbell). This allows connect/express servers to log using log4js. See example-connect-logger.js. var log4js = require('./lib/log4js'); log4js.addAppender(log4js.consoleAppender()); log4js.addAppender(log4js.fileAppender('cheese.log'), 'cheese'); - + var logger = log4js.getLogger('cheese'); - + logger.setLevel('INFO'); - + var app = require('express').createServer(); app.configure(function() { app.use(log4js.connectLogger(logger, { level: log4js.levels.INFO })); @@ -100,6 +100,62 @@ The options object that is passed to log4js.connectLogger supports a format stri app.use(log4js.connectLogger(logger, { level: log4js.levels.INFO, format: ':method :url' })); }); +## hook.io logger + +A [hook.io](https://github.com/hookio) logger has been added to logjs by [dbrain](https://github.com/dbrain). This allows multiple worker processes to log through a single master process, avoiding issues with rolling etc. in a clustered environment. +This was mainly created for [cluster](https://github.com/LearnBoost/cluster), but you can adapt the example to match your needs, you know, if it fits them. +
+    #### log4js-master.json ####
+    {
+      "appenders": [{
+        "type": "logLevelFilter",
+        "level": "DEBUG",
+        "appender": {
+          "type": "hookio",
+          "name": "hookio-logger",
+          "mode": "master",
+          "debug": false,
+          "appender": {
+            "type": "file",
+            "filename": "muffin.log",
+            "maxLogSize": 104857600,
+            "backups": 10,
+            "pollInterval": 15
+          }
+        }
+      }]
+    }
+    #### log4js-worker.json ####
+    {
+      "appenders": [{
+        "type": "logLevelFilter",
+        "level": "DEBUG",
+        "appender": {
+          "type": "hookio",
+          "name": "hookio-logger",
+          "mode": "worker",
+          "debug": false
+        }
+      }]
+    }
+    #### ilikebeans.js ####
+    var cluster = require('cluster');
+    var hookCluster = cluster('./doyoulikebeans');
+
+    // Perform the once off configuration depending on type of cluster
+    if (aboutCluster.isMaster) {
+      require('log4js').configure('log4js-master.json');
+    } else {
+      require('log4js').configure('log4js-worker.json');
+    }
+
+    // Standard cluster startup
+    hookCluster
+      .use(cluster.logger('run/logs'))
+      .use(cluster.pidfiles('run/pids'))
+      .listen(3000);
+
+ ## author (of this node version) Gareth Jones (csausdev - gareth.jones@sensis.com.au) @@ -107,5 +163,5 @@ Gareth Jones (csausdev - gareth.jones@sensis.com.au) ## License The original log4js was distributed under the Apache 2.0 License, and so is this. I've tried to -keep the original copyright and author credits in place, except in sections that I have rewritten +keep the original copyright and author credits in place, except in sections that I have rewritten extensively. From b93691b82acde046f98bf591ecc3099bc9e61821 Mon Sep 17 00:00:00 2001 From: Danny Brain Date: Thu, 27 Oct 2011 13:13:22 +1100 Subject: [PATCH 03/10] Update readme to describe hook.io usage --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3bb239c..2cd7b87 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ The options object that is passed to log4js.connectLogger supports a format stri ## hook.io logger -A [hook.io](https://github.com/hookio) logger has been added to logjs by [dbrain](https://github.com/dbrain). This allows multiple worker processes to log through a single master process, avoiding issues with rolling etc. in a clustered environment. +A [hook.io](https://github.com/hookio) logger has been added to log4js by [dbrain](https://github.com/dbrain). This allows multiple worker processes to log through a single master process, avoiding issues with rolling etc. in a clustered environment. This was mainly created for [cluster](https://github.com/LearnBoost/cluster), but you can adapt the example to match your needs, you know, if it fits them.
     #### log4js-master.json ####

From 681decf51fbc1308b4ff24496a91292c0898bd76 Mon Sep 17 00:00:00 2001
From: Danny Brain 
Date: Thu, 27 Oct 2011 13:14:10 +1100
Subject: [PATCH 04/10] Update readme to describe hook.io usage

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 2cd7b87..3ffb1b8 100644
--- a/README.md
+++ b/README.md
@@ -143,7 +143,7 @@ This was mainly created for [cluster](https://github.com/LearnBoost/cluster), bu
     var hookCluster = cluster('./doyoulikebeans');
 
     // Perform the once off configuration depending on type of cluster
-    if (aboutCluster.isMaster) {
+    if (hookCluster.isMaster) {
       require('log4js').configure('log4js-master.json');
     } else {
       require('log4js').configure('log4js-worker.json');

From 7bc460e8e0c19156a07375f442b8a45e2f0a4e4f Mon Sep 17 00:00:00 2001
From: Danny Brain 
Date: Thu, 27 Oct 2011 13:14:29 +1100
Subject: [PATCH 05/10] Update readme to describe hook.io usage

---
 README.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/README.md b/README.md
index 3ffb1b8..02a4199 100644
--- a/README.md
+++ b/README.md
@@ -125,6 +125,7 @@ This was mainly created for [cluster](https://github.com/LearnBoost/cluster), bu
         }
       }]
     }
+
     #### log4js-worker.json ####
     {
       "appenders": [{
@@ -138,6 +139,7 @@ This was mainly created for [cluster](https://github.com/LearnBoost/cluster), bu
         }
       }]
     }
+
     #### ilikebeans.js ####
     var cluster = require('cluster');
     var hookCluster = cluster('./doyoulikebeans');

From d099a9fc3fc2b4d332bc42e0f678a73efc9b8e43 Mon Sep 17 00:00:00 2001
From: Danny Brain 
Date: Thu, 27 Oct 2011 13:16:42 +1100
Subject: [PATCH 06/10] Update readme to describe hook.io usage

---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index 02a4199..f1926da 100644
--- a/README.md
+++ b/README.md
@@ -157,6 +157,7 @@ This was mainly created for [cluster](https://github.com/LearnBoost/cluster), bu
       .use(cluster.pidfiles('run/pids'))
       .listen(3000);
 
+*NOTE* hook.io appender will currently (and probably indefinitely) explode if you enable hook.io debug because of the way log4js overrides console.log ## author (of this node version) From 25aa075fad2c3159b9427048f3281cc9ba7675b9 Mon Sep 17 00:00:00 2001 From: Danny Brain Date: Thu, 27 Oct 2011 16:03:06 +1100 Subject: [PATCH 07/10] Basic (ugly) test --- test/hookioAppender.js | 88 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 test/hookioAppender.js diff --git a/test/hookioAppender.js b/test/hookioAppender.js new file mode 100644 index 0000000..70c19b9 --- /dev/null +++ b/test/hookioAppender.js @@ -0,0 +1,88 @@ +var vows = require('vows'); +var assert = require('assert'); +var sandbox = require('sandboxed-module'); + +function fancyResultingHookioAppender(opts) { + var result = { ons: {}, emissions: {}, logged: [] }; + var fakeLog4Js = { + appenderMakers: { file: function (config) { + return function log(logEvent) { + result.logged.push(logEvent); + } + }} + }; + var fakeHookIo = { Hook: function() { } }; + fakeHookIo.Hook.prototype.start = function () { + result.startCalled = true; + }; + fakeHookIo.Hook.prototype.on = function (eventName, functionToExec) { + result.ons[eventName] = { functionToExec: functionToExec }; + if (eventName === 'hook::ready') { + functionToExec(); + } + }; + fakeHookIo.Hook.prototype.emit = function (eventName, data) { + result.emissions[eventName] = result.emissions[eventName] || []; + result.emissions[eventName].push({data: data}); + var on = '*::' + eventName; + if (eventName !== 'hook::ready' && result.ons[on]) { + result.ons[on].callingCount = result.ons[on].callingCount ? result.ons[on].callingCount += 1 : 1; + result.ons[on].functionToExec(data); + } + }; + return { theResult: result, + theModule: sandbox.require('../lib/appenders/hookio', { + requires: { + '../log4js': fakeLog4Js, + 'hook.io': fakeHookIo + } + }) + }; +} + + +vows.describe('log4js hookioAppender').addBatch({ + 'master': { + topic: function() { + var fancy = fancyResultingHookioAppender(); + var logger = fancy.theModule.configure({ name: 'ohno', mode: 'master', appender: { type: 'file' } }); + logger({ level: { levelStr: 'INFO' }, data: "ALRIGHTY THEN", startTime: '2011-10-27T03:53:16.031Z' }); + logger({ level: { levelStr: 'DEBUG' }, data: "OH WOW", startTime: '2011-10-27T04:53:16.031Z'}); + return fancy.theResult; + }, + + 'should write to the actual appender': function (result) { + assert.isTrue(result.startCalled); + assert.equal(result.logged.length, 2); + assert.equal(result.emissions['ohno::log'].length, 2); + assert.equal(result.ons['*::ohno::log'].callingCount, 2); + }, + + 'data written should be formatted correctly': function (result) { + assert.equal(result.logged[0].level.toString(), 'INFO'); + assert.equal(result.logged[0].data, 'ALRIGHTY THEN'); + assert.isTrue(typeof(result.logged[0].startTime) === 'object'); + assert.equal(result.logged[1].level.toString(), 'DEBUG'); + assert.equal(result.logged[1].data, 'OH WOW'); + assert.isTrue(typeof(result.logged[1].startTime) === 'object'); + } + }, + 'worker': { + 'should emit logging events to the master': { + topic: function() { + var fancy = fancyResultingHookioAppender(); + var logger = fancy.theModule.configure({ name: 'ohno', mode: 'worker', appender: { type: 'file' } }); + logger({ level: { levelStr: 'INFO' }, data: "ALRIGHTY THEN", startTime: '2011-10-27T03:53:16.031Z' }); + logger({ level: { levelStr: 'DEBUG' }, data: "OH WOW", startTime: '2011-10-27T04:53:16.031Z'}); + return fancy.theResult; + }, + + 'should not write to the actual appender': function (result) { + assert.isTrue(result.startCalled); + assert.equal(result.logged.length, 0); + assert.equal(result.emissions['ohno::log'].length, 2); + assert.isUndefined(result.ons['*::ohno::log']); + } + } + } +}).exportTo(module); From 23a2758a6ddf7c23c1c8e62e654b15afcd68c9e3 Mon Sep 17 00:00:00 2001 From: Danny Brain Date: Thu, 27 Oct 2011 16:25:38 +1100 Subject: [PATCH 08/10] Lazy load any new style appenders --- lib/appenders/hookio.js | 1 + lib/log4js.js | 21 +++++++++++---------- package.json | 4 ++-- test/hookioAppender.js | 10 ++++++++-- test/logging.js | 24 ++++++++++++------------ 5 files changed, 34 insertions(+), 26 deletions(-) diff --git a/lib/appenders/hookio.js b/lib/appenders/hookio.js index 44f5c06..3ce3301 100644 --- a/lib/appenders/hookio.js +++ b/lib/appenders/hookio.js @@ -43,6 +43,7 @@ function createAppender(hookioOptions, actualAppender) { function configure(config) { var actualAppender; if (config.appender && config.mode === 'master') { + log4js.loadAppender(config.appender.type); actualAppender = log4js.appenderMakers[config.appender.type](config.appender); } delete config.appender; diff --git a/lib/log4js.js b/lib/log4js.js index 2eea7a9..340f5c3 100644 --- a/lib/log4js.js +++ b/lib/log4js.js @@ -136,6 +136,7 @@ function configureAppenders(appenderList) { clearAppenders(); if (appenderList) { appenderList.forEach(function(appenderConfig) { + loadAppender(appenderConfig.type); var appender; appenderConfig.makers = appenderMakers; appender = appenderMakers[appenderConfig.type](appenderConfig); @@ -347,15 +348,10 @@ function replaceConsole(logger) { }); } -function loadAppenders() { - var appenderList = fs.readdirSync(__dirname + '/appenders'); - appenderList.forEach(function(file) { - if (/\.js$/.test(file)) { - var appenderModule = require('./appenders/' + file); - module.exports.appenders[appenderModule.name] = appenderModule.appender; - appenderMakers[appenderModule.name] = appenderModule.configure; - } - }); +function loadAppender(appender) { + var appenderModule = require('./appenders/' + appender); + module.exports.appenders[appenderModule.name] = appenderModule.appender; + appenderMakers[appenderModule.name] = appenderModule.configure; } module.exports = { @@ -363,6 +359,7 @@ module.exports = { getDefaultLogger: getDefaultLogger, addAppender: addAppender, + loadAppender: loadAppender, clearAppenders: clearAppenders, configure: configure, @@ -375,7 +372,11 @@ module.exports = { connectLogger: require('./connect-logger').connectLogger }; -loadAppenders(); +//load the old-style appenders +[ 'console', 'file', 'logLevelFilter' ].forEach(function(appender) { + loadAppender(appender); +}); + //set ourselves up if we can find a default log4js.json configure(findConfiguration()); //replace console.log, etc with log4js versions diff --git a/package.json b/package.json index 7487e3b..fc006e4 100644 --- a/package.json +++ b/package.json @@ -22,10 +22,10 @@ "lib": "lib" }, "dependencies": { - "hook.io": "0.7.7" }, "devDependencies": { "vows": ">=0.5.2", - "sandboxed-module": ">= 0.1.1" + "sandboxed-module": ">= 0.1.1", + "hook.io": "0.7.7" } } diff --git a/test/hookioAppender.js b/test/hookioAppender.js index 70c19b9..87afdc0 100644 --- a/test/hookioAppender.js +++ b/test/hookioAppender.js @@ -4,13 +4,18 @@ var sandbox = require('sandboxed-module'); function fancyResultingHookioAppender(opts) { var result = { ons: {}, emissions: {}, logged: [] }; + var fakeLog4Js = { - appenderMakers: { file: function (config) { + appenderMakers: {} + }; + fakeLog4Js.loadAppender = function (appender) { + fakeLog4Js.appenderMakers[appender] = function (config) { return function log(logEvent) { result.logged.push(logEvent); } - }} + }; }; + var fakeHookIo = { Hook: function() { } }; fakeHookIo.Hook.prototype.start = function () { result.startCalled = true; @@ -30,6 +35,7 @@ function fancyResultingHookioAppender(opts) { result.ons[on].functionToExec(data); } }; + return { theResult: result, theModule: sandbox.require('../lib/appenders/hookio', { requires: { diff --git a/test/logging.js b/test/logging.js index 0c881c9..94c699b 100644 --- a/test/logging.js +++ b/test/logging.js @@ -69,7 +69,7 @@ vows.describe('log4js').addBatch({ , log4js = sandbox.require( '../lib/log4js' , { requires: - { './appenders/file.js': + { './appenders/file': { name: "file" , appender: function() {} @@ -123,10 +123,10 @@ vows.describe('log4js').addBatch({ }); }, readdirSync: function() { - return ['file.js']; + return ['file']; } } - , './appenders/file.js': + , './appenders/file': { name: "file" , appender: function() {} @@ -168,7 +168,7 @@ vows.describe('log4js').addBatch({ '../lib/log4js' , { requires: { - './appenders/console.js': fakeConsoleAppender + './appenders/console': fakeConsoleAppender } } ); @@ -303,7 +303,7 @@ vows.describe('log4js').addBatch({ { requires: { 'fs': fakeFS - , './appenders/console.js': fakeConsole + , './appenders/console': fakeConsole } } ); @@ -434,7 +434,7 @@ vows.describe('log4js').addBatch({ { requires: { 'fs': fakeFS, - './appenders/console.js': fakeConsole + './appenders/console': fakeConsole }, globals: { 'console': fakeConsole, @@ -462,7 +462,7 @@ vows.describe('log4js').addBatch({ assert.equal(logEvents[2].data[0], 'debug4'); } }, - + 'configuration reload with configuration staying the same' : { topic: function() { var pathsChecked = [], @@ -494,10 +494,10 @@ vows.describe('log4js').addBatch({ } }, fakeConsole = { - 'name': 'console', + 'name': 'console', 'appender': function () { return function(evt) { logEvents.push(evt); }; - }, + }, 'configure': function (config) { return fakeConsole.appender(); } @@ -510,8 +510,8 @@ vows.describe('log4js').addBatch({ '../lib/log4js', { requires: { - 'fs': fakeFS, - './appenders/console.js': fakeConsole + 'fs': fakeFS, + './appenders/console': fakeConsole }, globals: { 'console': fakeConsole, @@ -538,7 +538,7 @@ vows.describe('log4js').addBatch({ var logEvents = args[1]; assert.length(logEvents, 2); assert.equal(logEvents[0].data[0], 'info1'); - assert.equal(logEvents[1].data[0], 'info3'); + assert.equal(logEvents[1].data[0], 'info3'); } } From 89f36598255432f91d6fcedb5a7e4774d6c245a0 Mon Sep 17 00:00:00 2001 From: Danny Brain Date: Thu, 27 Oct 2011 16:37:11 +1100 Subject: [PATCH 09/10] Fix the logLevelFilter with lazy loading --- lib/appenders/logLevelFilter.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/appenders/logLevelFilter.js b/lib/appenders/logLevelFilter.js index 01375a4..2907aaa 100644 --- a/lib/appenders/logLevelFilter.js +++ b/lib/appenders/logLevelFilter.js @@ -1,4 +1,5 @@ var levels = require('../levels'); +var log4js = require('../log4js'); function logLevelFilter (levelString, appender) { var level = levels.toLevel(levelString); @@ -10,10 +11,11 @@ function logLevelFilter (levelString, appender) { } function configure(config) { - var appender = config.makers[config.appender.type](config.appender); + log4js.loadAppender(config.appender.type); + var appender = log4js.appenderMakers[config.appender.type](config.appender); return logLevelFilter(config.level, appender); } exports.name = "logLevelFilter"; exports.appender = logLevelFilter; -exports.configure = configure; \ No newline at end of file +exports.configure = configure; From 07e920cc1b67f9eb5020566ce2379bad0c48bdb5 Mon Sep 17 00:00:00 2001 From: Danny Brain Date: Thu, 27 Oct 2011 16:43:55 +1100 Subject: [PATCH 10/10] Quick check to make sure the actualAppender gets the right configuration --- test/hookioAppender.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/hookioAppender.js b/test/hookioAppender.js index 87afdc0..32c3d66 100644 --- a/test/hookioAppender.js +++ b/test/hookioAppender.js @@ -10,6 +10,7 @@ function fancyResultingHookioAppender(opts) { }; fakeLog4Js.loadAppender = function (appender) { fakeLog4Js.appenderMakers[appender] = function (config) { + result.actualLoggerConfig = config; return function log(logEvent) { result.logged.push(logEvent); } @@ -71,6 +72,10 @@ vows.describe('log4js hookioAppender').addBatch({ assert.equal(result.logged[1].level.toString(), 'DEBUG'); assert.equal(result.logged[1].data, 'OH WOW'); assert.isTrue(typeof(result.logged[1].startTime) === 'object'); + }, + + 'the actual logger should get the right config': function (result) { + assert.equal(result.actualLoggerConfig.type, 'file'); } }, 'worker': {