8000 Merge branch 'master' of https://github.com/nomiddlename/log4js-node · rboss/log4js-node@b6ba3bc · GitHub
[go: up one dir, main page]

Skip to content

Commit b6ba3bc

Browse files
author
Gareth Jones
committed
2 parents 638ce18 + ce2d7df commit b6ba3bc

File tree

2 files changed

+152
-146
lines changed

2 files changed

+152
-146
lines changed

lib/appenders/smtp.js

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,57 @@
11
var layouts = require("../layouts"),
2-
mailer = require("nodemailer");
2+
mailer = require("nodemailer"),
3+
os = require('os');
34

45
/**
5-
* SMTP Appender. Sends logging events using SMTP protocol.
6+
* SMTP Appender. Sends logging events using SMTP protocol.
67
* It can either send an email on each event or group several logging events gathered during specified interval.
78
*
8-
* @param recipients comma separated list of email recipients
9-
* @param sender sender of all emails (defaults to SMTP user)
10-
* @param subject subject of all email messages (defaults to first event's message)
9+
* @param config appender configuration data
1110
* @param layout a function that takes a logevent and returns a string (defaults to basicLayout).
12-
* @param smtpConfig SMTP configuration for 'nodemailer'
13-
* @param sendInterval the time in seconds between sending attempts (defaults to 0);
1411
* all events are buffered and sent in one email during this time; if 0 than every event sends an email
1512
*/
16-
function smtpAppender(recipients, sender, subject, layout, smtpConfig, sendInterval) {
17-
sender = sender || smtpConfig.user;
13+
function smtpAppender(config, layout) {
1814
layout = layout || layouts.basicLayout;
19-
subjectLayout = layouts.messagePassThroughLayout;
20-
mailer.SMTP = smtpConfig;
21-
sendInterval = sendInterval*1000 || 0;
22-
15+
var subjectLayout = layouts.messagePassThroughLayout;
16+
var sendInterval = config.sendInterval*1000 || 0;
17+
2318
var logEventBuffer = [];
2419
var sendTimer;
25-
20+
var transport = mailer.createTransport(config.transport, config[config.transport]);
21+
2622
function sendBuffer() {
2723
if (logEventBuffer.length == 0)
2824
return;
29-
25+
3026
var firstEvent = logEventBuffer[0];
3127
var body = "";
3228
while (logEventBuffer.length > 0) {
3329
body += layout(logEventBuffer.shift()) + "\n";
3430
}
35-
31+
3632
var msg = {
37-
sender: sender,
38-
to: recipients,
39-
subject: subject || subjectLayout(firstEvent),
40-
body: body
33+
to: config.recipients,
34+
subject: config.subject || subjectLayout(firstEvent),
35+
text: body,
36+
headers: {"Hostname": os.hostname()}
4137
};
42-
mailer.send_mail(msg, function(error, success) {
38+
if (config.sender)
39+
msg.from = config.sender;
40+
transport.sendMail(msg, function(error, success) {
4341
if (error) {
4442
console.error("log4js.smtpAppender - Error happened ", error);
4543
}
4644
});
4745
}
48-
46+
4947
function scheduleSend() {
5048
if (!sendTimer)
5149
sendTimer = setTimeout(function() {
52-
sendTimer = null;
50+
sendTimer = null;
5351
sendBuffer();
5452
}, sendInterval);
5553
}
56-
54+
5755
return function(loggingEvent) {
5856
logEventBuffer.push(loggingEvent);
5957
if (sendInterval > 0)
@@ -68,8 +66,10 @@ function configure(config) {
6866
if (config.layout) {
6967
layout = layouts.layout(config.layout.type, config.layout);
7068
}
71-
return smtpAppender(config.recipients, config.sender, config.subject, layout, config.smtp, config.sendInterval);
69+
return smtpAppender(config, layout);
7270
}
7371

72+
exports.name = "smtp";
7473
exports.appender = smtpAppender;
7574
exports.configure = configure;
75+

test/smtpAppender.js

Lines changed: 127 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -7,156 +7,162 @@ function setupLogging(category, options) {
77
var msgs = [];
88

99
var fakeMailer = {
10-
send_mail: function (msg, callback) {
11-
msgs.push(msg) 10000 ;
12-
callback(null, true);
13-
}
10+
createTransport: function (name, options) {
11+
return {
12+
config: options,
13+
sendMail: function (msg, callback) {
14+
msgs.push(msg);
15+
callback(null, true);
16+
}
17+
};
18+
}
1419
};
1520

1621
var smtpModule = sandbox.require('../lib/appenders/smtp', {
17-
requires: {
18-
'nodemailer': fakeMailer
19-
}
22+
requires: {
23+
'nodemailer': fakeMailer
24+
}
2025
});
2126

2227
log4js.addAppender(smtpModule.configure(options), category);
2328

2429
return {
25-
logger: log4js.getLogger(category),
26-
mailer: fakeMailer,
27-
results: msgs
30+
logger: log4js.getLogger(category),
31+
mailer: fakeMailer,
32+
results: msgs
2833
};
2934
}
3035

3136
function checkMessages (result, sender, subject) {
3237
for (var i = 0; i < result.results.length; ++i) {
33-
assert.equal(result.results[i].sender, sender ? sender : result.mailer.SMTP.user);
34-
assert.equal(result.results[i].to, 'recipient@domain.com');
35-
assert.equal(result.results[i].subject, subject ? subject : 'Log event #' + (i+1));
36-
assert.ok(new RegExp('.+Log event #' + (i+1) + '\n$').test(result.results[i].body));
38+
assert.equal(result.results[i].from, sender);
39+
assert.equal(result.results[i].to, 'recipient@domain.com');
40+
assert.equal(result.results[i].subject, subject ? subject : 'Log event #' + (i+1));
41+
assert.ok(new RegExp('.+Log event #' + (i+1) + '\n$').test(result.results[i].text));
3742
}
3843
}
3944

4045
log4js.clearAppenders();
4146
vows.describe('log4js smtpAppender').addBatch({
4247
'minimal config': {
43-
topic: function() {
44-
var setup = setupLogging('minimal config', {
45-
recipients: 'recipient@domain.com',
46-
smtp: {
47-
port: 25,
48-
user: 'user@domain.com'
48+
topic: function() {
49+
var setup = setupLogging('minimal config', {
50+
recipients: 'recipient@domain.com',
51+
transport: "SMTP",
52+
SMTP: {
53+
port: 25,
54+
auth: {
55+
user: 'user@domain.com'
56+
}
57+
}
58+
});
59+
setup.logger.info('Log event #1');
60+
return setup;
61+
},
62+
'there should be one message only': function (result) {
63+
assert.equal(result.results.length, 1);
64+
},
65+
'message should contain proper data': function (result) {
66+
checkMessages(result);
4967
}
50-
});
51-
setup.logger.info('Log event #1');
52-
return setup;
53-
},
54-
'mailer should be configured properly': function (result) {
55-
assert.ok(result.mailer.SMTP);
56-
assert.equal(result.mailer.SMTP.port, 25);
57-
assert.equal(r 1241 esult.mailer.SMTP.user, 'user@domain.com');
58-
},
59-
'there should be one message only': function (result) {
60-
assert.equal(result.results.length, 1);
61-
},
62-
'message should contain proper data': function (result) {
63-
checkMessages(result);
64-
}
6568
},
6669
'fancy config': {
67-
topic: function() {
68-
var setup = setupLogging('fancy config', {
69-
recipients: 'recipient@domain.com',
70-
sender: 'sender@domain.com',
71-
subject: 'This is subject',
72-
smtp: {
73-
port: 25,
74-
user: 'user@domain.com'
70+
topic: function() {
71+
var setup = setupLogging('fancy config', {
72+
recipients: 'recipient@domain.com',
73+
sender: 'sender@domain.com',
74+
subject: 'This is subject',
75+
transport: "SMTP",
76+
SMTP: {
77+
port: 25,
78+
auth: {
79+
user: 'user@domain.com'
80+
}
81+
}
82+
});
83+
setup.logger.info('Log event #1');
84+
return setup;
85+
},
86+
'there should be one message only': function (result) {
87+
assert.equal(result.results.length, 1);
88+
},
89+
'message should contain proper data': function (result) {
90+
checkMessages(result, 'sender@domain.com', 'This is subject');
7591
}
76-
});
77-
setup.logger.info('Log event #1');
78-
return setup;
79-
},
80-
'mailer should be configured properly': function (result) {
81-
assert.ok(result.mailer.SMTP);
82-
assert.equal(result.mailer.SMTP.port, 25);
83-
assert.equal(result.mailer.SMTP.user, 'user@domain.com');
84-
},
85-
'there should be one message only': function (result) {
86-
assert.equal(result.results.length, 1);
87-
},
88-
'message should contain proper data': function (result) {
89-
checkMessages(result, 'sender@domain.com', 'This is subject');
90-
}
9192
},
9293
'separate email for each event': {
93-
topic: function() {
94-
var self = this;
95-
var setup = setupLogging('separate email for each event', {
96-
recipients: 'recipient@domain.com',
97-
smtp: {
98-
port: 25,
99-
user: 'user@domain.com'
94+
topic: function() {
95+
var self = this;
96+
var setup = setupLogging('separate email for each event', {
97+
recipients: 'recipient@domain.com',
98+
transport: "SMTP",
99+
SMTP: {
100+
port: 25,
101+
auth: {
102+
user: 'user@domain.com'
103+
}
104+
}
105+
});
106+
setTimeout(function () {
107+
setup.logger.info('Log event #1');
108+
}, 0);
109+
setTimeout(function () {
110+
setup.logger.info('Log event #2');
111+
}, 500);
112+
setTimeout(function () {
113+
setup.logger.info('Log event #3');
114+
}, 1050);
115+
setTimeout(function () {
116+
self.callback(null, setup);
117+
}, 2100);
118+
},
119+
'there should be three messages': function (result) {
120+
assert.equal(result.results.length, 3);
121+
},
122+
'messages should contain proper data': function (result) {
123+
checkMessages(result);
100124
}
101-
});
102-
setTimeout(function () {
103-
setup.logger.info('Log event #1');
104-
}, 0);
105-
setTimeout(function () {
106-
setup.logger.info('Log event #2');
107-
}, 500);
108-
setTimeout(function () {
109-
setup.logger.info('Log event #3');
110-
}, 1050);
111-
setTimeout(function () {
112-
self.callback(null, setup);
113-
}, 2100);
114-
},
115-
'there should be three messages': function (result) {
116-
assert.equal(result.results.length, 3);
117-
},
118-
'messages should contain proper data': function (result) {
119-
checkMessages(result);
120-
}
121125
},
122126
'multiple events in one email': {
123-
topic: function() {
124-
var self = this;
125-
var setup = setupLogging('multiple events in one email', {
126-
recipients: 'recipient@domain.com',
127-
sendInterval: 1,
128-
smtp: {
129-
port: 25,
130-
user: 'user@domain.com'
127+
topic: function() {
128+
var self = this;
129+
var setup = setupLogging('multiple events in one email', {
130+
recipients: 'recipient@domain.com',
131+
sendInterval: 1,
132+
transport: "SMTP",
133+
SMTP: {
134+
port: 25,
135+
auth: {
136+
user: 'user@domain.com'
137+
}
138+
}
139+
});
140+
setTimeout(function () {
141+
setup.logger.info('Log event #1');
142+
}, 0);
143+
setTimeout(function () {
144+
setup.logger.info('Log event #2');
145+
}, 500);
146+
setTimeout(function () {
147+
setup.logger.info('Log event #3');
148+
}, 1050);
149+
setTimeout(function () {
150+
self.callback(null, setup);
151+
}, 2100);
152+
},
153+
'there should be two messages': function (result) {
154+
assert.equal(result.results.length, 2);
155+
},
156+
'messages should contain proper data': function (result) {
157+
assert.equal(result.results[0].to, 'recipient@domain.com');
158+
assert.equal(result.results[0].subject, 'Log event #1');
159+
assert.equal(result.results[0].text.match(new RegExp('.+Log event #[1-2]$', 'gm')).length, 2);
160+
161+
assert.equal(result.results[1].to, 'recipient@domain.com');
162+
assert.equal(result.results[1].subject, 'Log event #3');
163+
assert.ok(new RegExp('.+Log event #3\n$').test(result.results[1].text));
131164
}
132-
});
133-
setTimeout(function () {
134-
setup.logger.info('Log event #1');
135-
}, 0);
136-
setTimeout(function () {
137-
setup.logger.info('Log event #2');
138-
}, 500);
139-
setTimeout(function () {
140-
setup.logger.info('Log event #3');
141-
}, 1050);
142-
setTimeout(function () {
143-
self.callback(null, setup);
144-
}, 2100);
145-
},
146-
'there should be two messages': function (result) {
147-
assert.equal(result.results.length, 2);
148-
},
149-
'messages should contain proper data': function (result) {
150-
assert.equal(result.results[0].sender, result.mailer.SMTP.user);
151-
assert.equal(result.results[0].to, 'recipient@domain.com');
152-
assert.equal(result.results[0].subject, 'Log event #1');
153-
assert.equal(result.results[0].body.match(new RegExp('.+Log event #[1-2]$', 'gm')).length, 2);
154-
155-
assert.equal(result.results[1].sender, result.mailer.SMTP.user);
156-
assert.equal(result.results[1].to, 'recipient@domain.com');
157-
assert.equal(result.results[1].subject, 'Log event #3');
158-
assert.ok(new RegExp('.+Log event #3\n$').test(result.results[1].body));
159-
}
160165
}
161166

162167
}).export(module);
168+

0 commit comments

Comments
 (0)
0