From bb644a163273752003653fa883226f8474585e47 Mon Sep 17 00:00:00 2001 From: Christiaan Westerbeek Date: Fri, 10 Jan 2014 20:47:48 +0100 Subject: [PATCH 1/5] Update README.md Will try to add a appender for Loggly in this Fork. I will keep it in to this feature alone as outlined in the rules --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6e479d6..7cfbb0f 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ Out of the box it supports the following features: * SMTP appender * GELF appender * hook.io appender +* Loggly appender * multiprocess appender (useful when you've got worker processes) * a logger for connect/express servers * configurable log message layout/patterns From 5286c503753c34bd1163440924e8d215b3fe6ede Mon Sep 17 00:00:00 2001 From: Christiaan Westerbeek Date: Fri, 10 Jan 2014 21:18:16 +0100 Subject: [PATCH 2/5] Added the basic files for Loggly appender appender, example, test not tested yet! --- examples/loggly-appender.js | 26 ++++++++++++++++++++++++ lib/appenders/loggly.js | 40 +++++++++++++++++++++++++++++++++++++ test/logglyAppender-test.js | 33 ++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 examples/loggly-appender.js create mode 100644 lib/appenders/loggly.js create mode 100644 test/logglyAppender-test.js diff --git a/examples/loggly-appender.js b/examples/loggly-appender.js new file mode 100644 index 0000000..9a7bc54 --- /dev/null +++ b/examples/loggly-appender.js @@ -0,0 +1,26 @@ +//Note that loggly appender needs node-loggly to work. +//If you haven't got node-loggly installed, you'll get cryptic +//"cannot find module" errors when using the loggly appender +var log4js = require('../lib/log4js') +, log +, logmailer +, i = 0; +log4js.configure({ + "appenders": [ + { + type: "console", + category: "test" + }, + { + "type": "loggly", + "token": "12345678901234567890", + "subdomain": "your-subdomain", + "tags": ["test"], + "category": "test" + } + ] +}); + +var logger = log4js.getLogger("test"); +logger.info("Test log message"); +logger.debug("Test log message"); \ No newline at end of file diff --git a/lib/appenders/loggly.js b/lib/appenders/loggly.js new file mode 100644 index 0000000..eccca02 --- /dev/null +++ b/lib/appenders/loggly.js @@ -0,0 +1,40 @@ +"use strict"; +var layouts = require("../layouts") +, mailer = require("loggly") +, os = require('os'); + + +/** + * Loggly Appender. Sends logging events to Loggly using node-loggly + * + * @param config object with loggly configuration data + * { + * token: 'your-really-long-input-token', + * subdomain: 'your-subdomain', + * tags: ['loggly-tag1', 'loggly-tag2', .., 'loggly-tagn'] + * } + * @param layout a function that takes a logevent and returns a string (defaults to basicLayout). + */ +function logglyAppender(config, layout) { + layout = layout || layouts.basicLayout; + + var client = loggly.createClient(config); + + + return function(loggingEvent) { + client.log(layout(loggingEvent)); + }; + +} + +function configure(config) { + var layout; + if (config.layout) { + layout = layouts.layout(config.layout.type, config.layout); + } + return logglyAppender(config, layout); +} + +exports.name = "loggly"; +exports.appender = logglyAppender; +exports.configure = configure; \ No newline at end of file diff --git a/test/logglyAppender-test.js b/test/logglyAppender-test.js new file mode 100644 index 0000000..2d7f575 --- /dev/null +++ b/test/logglyAppender-test.js @@ -0,0 +1,33 @@ +"use strict"; +var assert = require('assert') +, vows = require('vows') +, layouts = require('../lib/layouts') +, sandbox = require('sandboxed-module'); + +vows.describe('../lib/appenders/loggly').addBatch({ + 'appender': { + topic: function() { + var messages = [] + , fakeLoggly = { + log: function(msg) { messages.push(msg); } + } + , appenderModule = sandbox.require( + '../lib/appenders/loggly', + { + globals: { + 'loggly': fakeLoggly + } + } + ) + , appender = appenderModule.appender(layouts.messagePassThroughLayout); + + appender({ data: ["blah"] }); + return messages; + }, + + 'should output to loggly': function(messages) { + assert.equal(messages[0], 'blah'); + } + } + +}).exportTo(module); From eb51aa99becea79fb8d2eaf43dba64932d5dc8f2 Mon Sep 17 00:00:00 2001 From: Christiaan Westerbeek Date: Fri, 10 Jan 2014 21:51:08 +0100 Subject: [PATCH 3/5] First working version tried examples/loggly-appender.js [OK] --- examples/loggly-appender.js | 18 ++++++++---------- lib/appenders/loggly.js | 15 +++++++++++---- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/examples/loggly-appender.js b/examples/loggly-appender.js index 9a7bc54..1465c92 100644 --- a/examples/loggly-appender.js +++ b/examples/loggly-appender.js @@ -1,10 +1,8 @@ //Note that loggly appender needs node-loggly to work. //If you haven't got node-loggly installed, you'll get cryptic //"cannot find module" errors when using the loggly appender -var log4js = require('../lib/log4js') -, log -, logmailer -, i = 0; +var log4js = require('../lib/log4js'); + log4js.configure({ "appenders": [ { @@ -12,15 +10,15 @@ log4js.configure({ category: "test" }, { - "type": "loggly", - "token": "12345678901234567890", + "type" : "loggly", + "token" : "12345678901234567890", "subdomain": "your-subdomain", - "tags": ["test"], - "category": "test" + "tags" : ["test"], + "category" : "loggly" } ] }); -var logger = log4js.getLogger("test"); +var logger = log4js.getLogger("loggly"); logger.info("Test log message"); -logger.debug("Test log message"); \ No newline at end of file +//logger.debug("Test log message"); \ No newline at end of file diff --git a/lib/appenders/loggly.js b/lib/appenders/loggly.js index eccca02..7f7df8f 100644 --- a/lib/appenders/loggly.js +++ b/lib/appenders/loggly.js @@ -1,6 +1,6 @@ "use strict"; var layouts = require("../layouts") -, mailer = require("loggly") +, loggly = require("loggly") , os = require('os'); @@ -22,7 +22,14 @@ function logglyAppender(config, layout) { return function(loggingEvent) { - client.log(layout(loggingEvent)); + console.log('attempts', loggingEvent, layout(loggingEvent), config.tags); + client.log(layout(loggingEvent), config.tags, function(err, result){ + if (err) { + console.log('Loggly: '+ err.message); + } else { + console.log('Loggly: '+ JSON.stringify(result)); + } + }); }; } @@ -35,6 +42,6 @@ function configure(config) { return logglyAppender(config, layout); } -exports.name = "loggly"; -exports.appender = logglyAppender; +exports.name = "loggly"; +exports.appender = logglyAppender; exports.configure = configure; \ No newline at end of file From 770f2da6278a7a752ebda0ff046c8146735414a3 Mon Sep 17 00:00:00 2001 From: Christiaan Westerbeek Date: Fri, 10 Jan 2014 21:59:39 +0100 Subject: [PATCH 4/5] Cleanup --- lib/appenders/loggly.js | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/lib/appenders/loggly.js b/lib/appenders/loggly.js index 7f7df8f..2b9efd4 100644 --- a/lib/appenders/loggly.js +++ b/lib/appenders/loggly.js @@ -3,7 +3,6 @@ var layouts = require("../layouts") , loggly = require("loggly") , os = require('os'); - /** * Loggly Appender. Sends logging events to Loggly using node-loggly * @@ -19,19 +18,10 @@ function logglyAppender(config, layout) { layout = layout || layouts.basicLayout; var client = loggly.createClient(config); - return function(loggingEvent) { - console.log('attempts', loggingEvent, layout(loggingEvent), config.tags); - client.log(layout(loggingEvent), config.tags, function(err, result){ - if (err) { - console.log('Loggly: '+ err.message); - } else { - console.log('Loggly: '+ JSON.stringify(result)); - } - }); + client.log(layout(loggingEvent), config.tags); }; - } function configure(config) { From 9b4c7d15744a9b24dc40e2d2270269ff547db8fa Mon Sep 17 00:00:00 2001 From: Christiaan Westerbeek Date: Thu, 16 Jan 2014 16:39:45 +0100 Subject: [PATCH 5/5] Fixes the error with test/logglyAppender-test Refs #172 I will add more relevant tests later --- test/logglyAppender-test.js | 99 +++++++++++++++++++++++++++---------- 1 file changed, 74 insertions(+), 25 deletions(-) diff --git a/test/logglyAppender-test.js b/test/logglyAppender-test.js index 2d7f575..7be81e3 100644 --- a/test/logglyAppender-test.js +++ b/test/logglyAppender-test.js @@ -1,33 +1,82 @@ "use strict"; -var assert = require('assert') -, vows = require('vows') -, layouts = require('../lib/layouts') -, sandbox = require('sandboxed-module'); +var vows = require('vows') +, assert = require('assert') +, log4js = require('../lib/log4js') +, sandbox = require('sandboxed-module') +; -vows.describe('../lib/appenders/loggly').addBatch({ - 'appender': { - topic: function() { - var messages = [] - , fakeLoggly = { - log: function(msg) { messages.push(msg); } - } - , appenderModule = sandbox.require( - '../lib/appenders/loggly', - { - globals: { - 'loggly': fakeLoggly - } +function setupLogging(category, options) { + var msgs = []; + + var fakeLoggly = { + createClient: function (options) { + return { + config: options, + log: function (msg, tags) { + msgs.push({ + msg: msg, + tags: tags + }); } - ) - , appender = appenderModule.appender(layouts.messagePassThroughLayout); + }; + } + }; - appender({ data: ["blah"] }); - return messages; + var fakeLayouts = { + layout: function(type, config) { + this.type = type; + this.config = config; + return log4js.layouts.messagePassThroughLayout; }, + basicLayout: log4js.layouts.basicLayout, + messagePassThroughLayout: log4js.layouts.messagePassThroughLayout + }; - 'should output to loggly': function(messages) { - assert.equal(messages[0], 'blah'); + var fakeConsole = { + errors: [], + error: function(msg, value) { + this.errors.push({ msg: msg, value: value }); + } + }; + + var logglyModule = sandbox.require('../lib/appenders/loggly', { + requires: { + 'loggly': fakeLoggly, + '../layouts': fakeLayouts + }, + globals: { + console: fakeConsole + } + }); + + log4js.addAppender(logglyModule.configure(options), category); + + return { + logger: log4js.getLogger(category), + loggly: fakeLoggly, + layouts: fakeLayouts, + console: fakeConsole, + results: msgs + }; +} + +log4js.clearAppenders(); +vows.describe('log4js logglyAppender').addBatch({ + 'minimal config': { + topic: function() { + var setup = setupLogging('loggly', { + token: 'your-really-long-input-token', + subdomain: 'your-subdomain', + tags: ['loggly-tag1', 'loggly-tag2', 'loggly-tagn'] + }); + + setup.logger.log('Log event #1'); + return setup; + }, + 'there should be one message only': function (topic) { + //console.log('topic', topic); + assert.equal(topic.results.length, 1); } } - -}).exportTo(module); + +}).export(module);