From bdb56e42562a7cd17d90270e35422e872576e84b Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Thu, 22 Aug 2013 08:19:51 +1000 Subject: [PATCH] moved smtp appender to log4js-smtp --- lib/appenders/smtp.js | 82 -------------- test/smtpAppender-test.js | 233 -------------------------------------- 2 files changed, 315 deletions(-) delete mode 100644 lib/appenders/smtp.js delete mode 100644 test/smtpAppender-test.js diff --git a/lib/appenders/smtp.js b/lib/appenders/smtp.js deleted file mode 100644 index 85accee..0000000 --- a/lib/appenders/smtp.js +++ /dev/null @@ -1,82 +0,0 @@ -"use strict"; -var layouts = require("../layouts") -, mailer = require("nodemailer") -, os = require('os'); - -/** -* SMTP Appender. Sends logging events using SMTP protocol. -* It can either send an email on each event or group several -* logging events gathered during specified interval. -* -* @param config appender configuration data -* config.sendInterval time between log emails (in seconds), if 0 -* then every event sends an email -* @param layout a function that takes a logevent and returns a string (defaults to basicLayout). -*/ -function smtpAppender(config, layout) { - layout = layout || layouts.basicLayout; - var subjectLayout = layouts.messagePassThroughLayout; - var sendInterval = config.sendInterval*1000 || 0; - - var logEventBuffer = []; - var sendTimer; - - function sendBuffer() { - if (logEventBuffer.length > 0) { - - var transport = mailer.createTransport(config.transport, config[config.transport]); - var firstEvent = logEventBuffer[0]; - var body = ""; - while (logEventBuffer.length > 0) { - body += layout(logEventBuffer.shift()) + "\n"; - } - - var msg = { - to: config.recipients, - subject: config.subject || subjectLayout(firstEvent), - text: body, - headers: { "Hostname": os.hostname() } - }; - if (config.sender) { - msg.from = config.sender; - } - transport.sendMail(msg, function(error, success) { - if (error) { - console.error("log4js.smtpAppender - Error happened", error); - } - transport.close(); - }); - } - } - - function scheduleSend() { - if (!sendTimer) { - sendTimer = setTimeout(function() { - sendTimer = null; - sendBuffer(); - }, sendInterval); - } - } - - return function(loggingEvent) { - logEventBuffer.push(loggingEvent); - if (sendInterval > 0) { - scheduleSend(); - } else { - sendBuffer(); - } - }; -} - -function configure(config) { - var layout; - if (config.layout) { - layout = layouts.layout(config.layout.type, config.layout); - } - return smtpAppender(config, layout); -} - -exports.name = "smtp"; -exports.appender = smtpAppender; -exports.configure = configure; - diff --git a/test/smtpAppender-test.js b/test/smtpAppender-test.js deleted file mode 100644 index 27cc179..0000000 --- a/test/smtpAppender-test.js +++ /dev/null @@ -1,233 +0,0 @@ -"use strict"; -var vows = require('vows') -, assert = require('assert') -, log4js = require('../lib/log4js') -, sandbox = require('sandboxed-module') -; - -function setupLogging(category, options) { - var msgs = []; - - var fakeMailer = { - createTransport: function (name, options) { - return { - config: options, - sendMail: function (msg, callback) { - msgs.push(msg); - callback(null, true); - }, - close: function() {} - }; - } - }; - - var fakeLayouts = { - layout: function(type, config) { - this.type = type; - this.config = config; - return log4js.layouts.messagePassThroughLayout; - }, - basicLayout: log4js.layouts.basicLayout, - messagePassThroughLayout: log4js.layouts.messagePassThroughLayout - }; - - var fakeConsole = { - errors: [], - error: function(msg, value) { - this.errors.push({ msg: msg, value: value }); - } - }; - - var smtpModule = sandbox.require('../lib/appenders/smtp', { - requires: { - 'nodemailer': fakeMailer, - '../layouts': fakeLayouts - }, - globals: { - console: fakeConsole - } - }); - - log4js.addAppender(smtpModule.configure(options), category); - - return { - logger: log4js.getLogger(category), - mailer: fakeMailer, - layouts: fakeLayouts, - console: fakeConsole, - results: msgs - }; -} - -function checkMessages (result, sender, subject) { - for (var i = 0; i < result.results.length; ++i) { - assert.equal(result.results[i].from, sender); - assert.equal(result.results[i].to, 'recipient@domain.com'); - assert.equal(result.results[i].subject, subject ? subject : 'Log event #' + (i+1)); - assert.ok(new RegExp('.+Log event #' + (i+1) + '\n$').test(result.results[i].text)); - } -} - -log4js.clearAppenders(); -vows.describe('log4js smtpAppender').addBatch({ - 'minimal config': { - topic: function() { - var setup = setupLogging('minimal config', { - recipients: 'recipient@domain.com', - transport: "SMTP", - SMTP: { - port: 25, - auth: { - user: 'user@domain.com' - } - } - }); - setup.logger.info('Log event #1'); - return setup; - }, - 'there should be one message only': function (result) { - assert.equal(result.results.length, 1); - }, - 'message should contain proper data': function (result) { - checkMessages(result); - } - }, - 'fancy config': { - topic: function() { - var setup = setupLogging('fancy config', { - recipients: 'recipient@domain.com', - sender: 'sender@domain.com', - subject: 'This is subject', - transport: "SMTP", - SMTP: { - port: 25, - auth: { - user: 'user@domain.com' - } - } - }); - setup.logger.info('Log event #1'); - return setup; - }, - 'there should be one message only': function (result) { - assert.equal(result.results.length, 1); - }, - 'message should contain proper data': function (result) { - checkMessages(result, 'sender@domain.com', 'This is subject'); - } - }, - 'config with layout': { - topic: function() { - var setup = setupLogging('config with layout', { - layout: { - type: "tester" - } - }); - return setup; - }, - 'should configure layout': function(result) { - assert.equal(result.layouts.type, 'tester'); - } - }, - 'separate email for each event': { - topic: function() { - var self = this; - var setup = setupLogging('separate email for each event', { - recipients: 'recipient@domain.com', - transport: "SMTP", - SMTP: { - port: 25, - auth: { - user: 'user@domain.com' - } - } - }); - setTimeout(function () { - setup.logger.info('Log event #1'); - }, 0); - setTimeout(function () { - setup.logger.info('Log event #2'); - }, 500); - setTimeout(function () { - setup.logger.info('Log event #3'); - }, 1050); - setTimeout(function () { - self.callback(null, setup); - }, 2100); - }, - 'there should be three messages': function (result) { - assert.equal(result.results.length, 3); - }, - 'messages should contain proper data': function (result) { - checkMessages(result); - } - }, - 'multiple events in one email': { - topic: function() { - var self = this; - var setup = setupLogging('multiple events in one email', { - recipients: 'recipient@domain.com', - sendInterval: 1, - transport: "SMTP", - SMTP: { - port: 25, - auth: { - user: 'user@domain.com' - } - } - }); - setTimeout(function () { - setup.logger.info('Log event #1'); - }, 0); - setTimeout(function () { - setup.logger.info('Log event #2'); - }, 500); - setTimeout(function () { - setup.logger.info('Log event #3'); - }, 1050); - setTimeout(function () { - self.callback(null, setup); - }, 2100); - }, - 'there should be two messages': function (result) { - assert.equal(result.results.length, 2); - }, - 'messages should contain proper data': function (result) { - assert.equal(result.results[0].to, 'recipient@domain.com'); - assert.equal(result.results[0].subject, 'Log event #1'); - assert.equal(result.results[0].text.match(new RegExp('.+Log event #[1-2]$', 'gm')).length, 2); - assert.equal(result.results[1].to, 'recipient@domain.com'); - assert.equal(result.results[1].subject, 'Log event #3'); - assert.ok(new RegExp('.+Log event #3\n$').test(result.results[1].text)); - } - }, - 'error when sending email': { - topic: function() { - var setup = setupLogging('error when sending email', { - recipients: 'recipient@domain.com', - sendInterval: 0, - transport: 'SMTP', - SMTP: { port: 25, auth: { user: 'user@domain.com' } } - }); - - setup.mailer.createTransport = function() { - return { - sendMail: function(msg, cb) { - cb({ message: "oh noes" }); - }, - close: function() { } - }; - }; - - setup.logger.info("This will break"); - return setup.console; - }, - 'should be logged to console': function(cons) { - assert.equal(cons.errors.length, 1); - assert.equal(cons.errors[0].msg, "log4js.smtpAppender - Error happened"); - assert.equal(cons.errors[0].value.message, 'oh noes'); - } - } - -}).export(module); -