8000 chore(merge): redis appender merged into version-2 · LikeABossProgrammer/log4js-node@fd9f138 · GitHub
[go: up one dir, main page]

Skip to content

Commit fd9f138

Browse files
author
Gareth Jones
committed
chore(merge): redis appender merged into version-2
1 parent 8be0b8e commit fd9f138

File tree

2 files changed

+69
-124
lines changed

2 files changed

+69
-124
lines changed

lib/appenders/redis.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,37 @@
11
'use strict';
22

3-
const layouts = require('../layouts');
43
const redis = require('redis');
54
const util = require('util');
65

76
function redisAppender(config, layout) {
8-
layout = layout || layouts.messagePassThroughLayout;
9-
const redisClient = redis.createClient(config.port, config.host, { auth_pass: config.pass });
7+
const host = config.host || '127.0.0.1';
8+
const port = config.port || 6379;
9+
const auth = config.pass ? { auth_pass: config.pass } : {};
10+
const redisClient = redis.createClient(port, host, auth);
11+
1012
redisClient.on('error', (err) => {
1113
if (err) {
12-
console.error('log4js.redisAppender - %s:%p Error: %s', config.host, config.port, util.inspect(err));
14+
console.error(`log4js.redisAppender - ${host}:${port} Error: ${util.inspect(err)}`);
1315
}
1416
});
17+
1518
return function (loggingEvent) {
1619
const message = layout(loggingEvent);
1720
redisClient.publish(config.channel, message, (err) => {
1821
if (err) {
19-
console.error('log4js.redisAppender - %s:%p Error: %s', config.host, config.port, util.inspect(err));
22+
console.error(`log4js.redisAppender - ${host}:${port} Error: ${util.inspect(err)}`);
2023
}
2124
});
2225
};
2326
}
2427

25-
function configure(config) {
26-
let layout;
28+
function configure(config, layouts) {
29+
let layout = layouts.messagePassThroughLayout;
2730
if (config.layout) {
2831
layout = layouts.layout(config.layout.type, config.layout);
2932
}
3033

3134
return redisAppender(config, layout);
3235
}
3336

34-
module.exports.appender = redisAppender;
3537
module.exports.configure = configure;

test/tap/redisAppender-test.js

Lines changed: 59 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1,183 +1,126 @@
11
'use strict';
22

33
const test = require('tap').test;
4-
const log4js = require('../../lib/log4js');
4+
// const log4js = require('../../lib/log4js');
55
const sandbox = require('sandboxed-module');
66

77
function setupLogging(category, options) {
8-
const msgs = [];
9-
10-
const redisCredentials = {
11-
type: options.type,
12-
host: options.host,
13-
port: options.port,
14-
pass: options.pass,
15-
channel: options.channel,
16-
layout: options.layout
17-
};
18-
198
const fakeRedis = {
9+
msgs: [],
2010
createClient: function (port, host, optionR) {
2111
this.port = port;
2212
this.host = host;
23-
this.optionR = {};
24-
this.optionR.auth_pass = optionR.pass;
13+
this.optionR = optionR;
2514

2615
return {
2716
on: function (event, callback) {
28-
callback('throw redis error #1');
17+
fakeRedis.errorCb = callback;
2918
},
3019
publish: function (channel, message, callback) {
31-
msgs.push(message);
32-
callback(null, {status: 'sent'});
20+
fakeRedis.msgs.push({ channel: channel, message: message });
21+
fakeRedis.publishCb = callback;
3322
}
3423
};
3524
}
3625
};
3726

38-
const fakeLayouts = {
39-
layout: function (type, config) {
40-
this.type = type;
41-
this.config = config;
42-
return log4js.layouts.messagePassThroughLayout;
43-
},
44-
basicLayout: log4js.layouts.basicLayout,
45-
coloredLayout: log4js.layouts.coloredLayout,
46-
messagePassThroughLayout: log4js.layouts.messagePassThroughLayout
47-
};
48-
49-
const fakeUtil = {
50-
inspect: function (item) {
51-
return JSON.stringify(item);
52-
}
53-
};
54-
5527
const fakeConsole = {
5628
errors: [],
57-
logs: [],
58-
error: function (msg, value) {
59-
this.errors.push({ msg: msg, value: value });
60-
},
61-
log: function (msg, value) {
62-
this.logs.push({ msg: msg, value: value });
29+
error: function (msg) {
30+
this.errors.push(msg);
6331
}
6432
};
6533

66-
const redisModule = sandbox.require('../../lib/appenders/redis', {
34+
const log4js = sandbox.require('../../lib/log4js', {
6735
requires: {
68-
'redis': fakeRedis,
69-
'../layouts': fakeLayouts,
70-
'util': fakeUtil
36+
redis: fakeRedis
7137
},
7238
globals: {
7339
console: fakeConsole
7440
}
7541
});
76-
77-
log4js.addAppender(redisModule.configure(options), category);
42+
log4js.configure({
43+
appenders: { redis: options },
44+
categories: { default: { appenders: ['redis'], level: 'trace' } }
45+
});
7846

7947
return {
8048
logger: log4js.getLogger(category),
81-
redis: fakeRedis,
82-
layouts: fakeLayouts,
83-
console: fakeConsole,
84-
messages: msgs,
85-
credentials: redisCredentials
49+
fakeRedis: fakeRedis,
50+
fakeConsole: fakeConsole
8651
};
8752
}
8853

89-
function checkMessages(assert, result) {
90-
for (let i = 0; i < result.messages.length; i++) {
91-
assert.ok(new RegExp(`Log event #${i + 1}`).test(result.messages[i]));
92-
}
93-
}
94-
95-
log4js.clearAppenders();
96-
9754
test('log4js redisAppender', (batch) => {
9855
batch.test('redis setup', (t) => {
9956
const result = setupLogging('redis setup', {
100-
host: '127.0.0.1',
101-
port: 6739,
57+
host: '123.123.123.123',
58+
port: 1234,
10259
pass: '123456',
10360
channel: 'log',
10461
type: 'redis',
10562
layout: {
10663
type: 'pattern',
107-
pattern: '%d{yyyy-MM-dd hh:mm:ss:SSS}#%p#%m'
64+
pattern: 'cheese %m'
10865
}
10966
});
67+
68+
result.logger.info('Log event #1');
69+
result.fakeRedis.publishCb();
70+
11071
t.test('redis credentials should match', (assert) => {
111-
assert.equal(result.credentials.host, '127.0.0.1');
112-
assert.equal(result.credentials.port, 6739);
113-
assert.equal(result.credentials.pass, '123456');
114-
assert.equal(result.credentials.channel, 'log');
115-
assert.equal(result.credentials.type, 'redis');
116-
assert.equal(result.credentials.layout.type, 'pattern');
117-
assert.equal(result.credentials.layout.pattern, '%d{yyyy-MM-dd hh:mm:ss:SSS}#%p#%m');
72+
assert.equal(result.fakeRedis.host, '123.123.123.123');
73+
assert.equal(result.fakeRedis.port, 1234);
74+
assert.equal(result.fakeRedis.optionR.auth_pass, '123456');
75+
assert.equal(result.fakeRedis.msgs.length, 1, 'should be one message only');
76+
assert.equal(result.fakeRedis.msgs[0].channel, 'log');
77+
assert.equal(result.fakeRedis.msgs[0].message, 'cheese Log event #1');
11878
assert.end();
11979
});
12080

12181
t.end();
12282
});
12383

124-
batch.test('basic usage', (t) => {
125-
const setup = setupLogging('basic usage', {
126-
host: '127.0.0.1',
127-
port: 6739,
128-
pass: '',
129-
channel: 'log',
84+
batch.test('default values', (t) => {
85+
const setup = setupLogging('defaults', {
13086
type: 'redis',
131-
layout: {
132-
type: 'pattern',
133-
pattern: '%d{yyyy-MM-dd hh:mm:ss:SSS}#%p#%m'
134-
}
87+
channel: 'thing'
13588
});
13689

137-
setup.logger.info('Log event #1');
138-
139-
t.equal(setup.messages.length, 1, 'should be one message only');
140-
checkMessages(t, setup);
141-
t.end();
142-
});
90+
setup.logger.info('just testing');
91+
setup.fakeRedis.publishCb();
14392

93+
t.test('should use localhost', (assert) => {
94+
assert.equal(setup.fakeRedis.host, '127.0.0.1');
95+
assert.equal(setup.fakeRedis.port, 6379);
96+
assert.same(setup.fakeRedis.optionR, {});
97+
assert.end();
98+
});
14499

145-
batch.test('config with layout', (t) => {
146-
const result = setupLogging('config with layout', {
147-
layout: {
148-
type: 'redis'
149-
}
100+
t.test('should use message pass through layout', (assert) => {
101+
assert.equal(setup.fakeRedis.msgs.length, 1);
102+
assert.equal(setup.fakeRedis.msgs[0].channel, 'thing');
103+
assert.equal(setup.fakeRedis.msgs[0].message, 'just testing');
104+
assert.end();
150105
});
151-
t.equal(result.layouts.type, 'redis', 'should configure layout');
106+
152107
t.end();
153108
});
154109

155-
batch.test('separate notification for each event', (t) => {
156-
const setup = setupLogging('separate notification for each event', {
157-
host: '127.0.0.1',
158-
port: 6739,
159-
pass: '',
160-
channel: 'log',
161-
type: 'redis',
162-
layout: {
163-
type: 'pattern',
164-
pattern: '%d{yyyy-MM-dd hh:mm:ss:SSS}#%p#%m'
165-
}
110+
batch.test('redis errors', (t) => {
111+
const setup = setupLogging('errors', { type: 'redis', channel: 'testing' });
112+
113+
setup.fakeRedis.errorCb('oh no, error on connect');
114+
setup.logger.info('something something');
115+
setup.fakeRedis.publishCb('oh no, error on publish');
116+
117+
t.test('should go to the console', (assert) => {
118+
assert.equal(setup.fakeConsole.errors.length, 2);
119+
assert.equal(setup.fakeConsole.errors[0], 'log4js.redisAppender - 127.0.0.1:6379 Error: \'oh no, error on connect\'');
120+
assert.equal(setup.fakeConsole.errors[1], 'log4js.redisAppender - 127.0.0.1:6379 Error: \'oh no, error on publish\'');
121+
assert.end();
166122
});
167-
setTimeout(() => {
168-
setup.logger.info('Log event #1');
169-
}, 0);
170-
setTimeout(() => {
171-
setup.logger.info('Log event #2');
172-
}, 500);
173-
setTimeout(() => {
174-
setup.logger.info('Log event #3');
175-
}, 1100);
176-
setTimeout(() => {
177-
t.equal(setup.messages.length, 3, 'should be three messages');
178-
checkMessages(t, setup);
179-
t.end();
180-
}, 3000);
123+
t.end();
181124
});
182125

183126
batch.end 36B9 ();

0 commit comments

Comments
 (0)
0