mirror of
https://github.com/log4js-node/log4js-node.git
synced 2025-12-08 19:26:01 +00:00
362 lines
11 KiB
JavaScript
362 lines
11 KiB
JavaScript
const { test } = require('tap');
|
|
const log4js = require('../../lib/log4js');
|
|
const categories = require('../../lib/categories');
|
|
|
|
test('log4js category inherit all appenders from direct parent', (batch) => {
|
|
batch.test('should inherit appenders from direct parent', (t) => {
|
|
const config = {
|
|
appenders: {
|
|
stdout1: { type: 'dummy-appender', label: 'stdout1' },
|
|
stdout2: { type: 'dummy-appender', label: 'stdout2' },
|
|
},
|
|
categories: {
|
|
default: { appenders: ['stdout1'], level: 'ERROR' },
|
|
catA: { appenders: ['stdout1', 'stdout2'], level: 'INFO' },
|
|
'catA.catB': { level: 'DEBUG' },
|
|
},
|
|
};
|
|
|
|
log4js.configure(config);
|
|
|
|
const childCategoryName = 'catA.catB';
|
|
const childAppenders = categories.appendersForCategory(childCategoryName);
|
|
const childLevel = categories.getLevelForCategory(childCategoryName);
|
|
|
|
t.ok(childAppenders);
|
|
t.equal(childAppenders.length, 2, 'inherited 2 appenders');
|
|
t.ok(
|
|
childAppenders.some((a) => a.label === 'stdout1'),
|
|
'inherited stdout1'
|
|
);
|
|
t.ok(
|
|
childAppenders.some((a) => a.label === 'stdout2'),
|
|
'inherited stdout2'
|
|
);
|
|
t.equal(childLevel.levelStr, 'DEBUG', 'child level overrides parent');
|
|
t.end();
|
|
});
|
|
|
|
batch.test(
|
|
'multiple children should inherit config from shared parent',
|
|
(t) => {
|
|
const config = {
|
|
appenders: {
|
|
stdout1: { type: 'dummy-appender', label: 'stdout1' },
|
|
stdout2: { type: 'dummy-appender', label: 'stdout2' },
|
|
},
|
|
categories: {
|
|
default: { appenders: ['stdout1'], level: 'ERROR' },
|
|
catA: { appenders: ['stdout1'], level: 'INFO' },
|
|
'catA.catB.cat1': { level: 'DEBUG' }, // should get sdtout1, DEBUG
|
|
'catA.catB.cat2': { appenders: ['stdout2'] }, // should get sdtout1,sdtout2, INFO
|
|
},
|
|
};
|
|
|
|
log4js.configure(config);
|
|
|
|
const child1CategoryName = 'catA.catB.cat1';
|
|
const child1Appenders =
|
|
categories.appendersForCategory(child1CategoryName);
|
|
const child1Level = categories.getLevelForCategory(child1CategoryName);
|
|
|
|
t.equal(child1Appenders.length, 1, 'inherited 1 appender');
|
|
t.ok(
|
|
child1Appenders.some((a) => a.label === 'stdout1'),
|
|
'inherited stdout1'
|
|
);
|
|
t.equal(child1Level.levelStr, 'DEBUG', 'child level overrides parent');
|
|
|
|
const child2CategoryName = 'catA.catB.cat2';
|
|
const child2Appenders =
|
|
categories.appendersForCategory(child2CategoryName);
|
|
const child2Level = categories.getLevelForCategory(child2CategoryName);
|
|
|
|
t.ok(child2Appenders);
|
|
t.equal(
|
|
child2Appenders.length,
|
|
2,
|
|
'inherited 1 appenders, plus its original'
|
|
);
|
|
t.ok(
|
|
child2Appenders.some((a) => a.label === 'stdout1'),
|
|
'inherited stdout1'
|
|
);
|
|
t.ok(
|
|
child2Appenders.some((a) => a.label === 'stdout2'),
|
|
'kept stdout2'
|
|
);
|
|
t.equal(child2Level.levelStr, 'INFO', 'inherited parent level');
|
|
|
|
t.end();
|
|
}
|
|
);
|
|
|
|
batch.test('should inherit appenders from multiple parents', (t) => {
|
|
const config = {
|
|
appenders: {
|
|
stdout1: { type: 'dummy-appender', label: 'stdout1' },
|
|
stdout2: { type: 'dummy-appender', label: 'stdout2' },
|
|
},
|
|
categories: {
|
|
default: { appenders: ['stdout1'], level: 'ERROR' },
|
|
catA: { appenders: ['stdout1'], level: 'INFO' },
|
|
'catA.catB': { appenders: ['stdout2'], level: 'INFO' }, // should get stdout1 and stdout2
|
|
'catA.catB.catC': { level: 'DEBUG' }, // should get stdout1 and stdout2
|
|
},
|
|
};
|
|
|
|
log4js.configure(config);
|
|
|
|
const childCategoryName = 'catA.catB.catC';
|
|
const childAppenders = categories.appendersForCategory(childCategoryName);
|
|
|
|
t.ok(childAppenders);
|
|
t.equal(childAppenders.length, 2, 'inherited 2 appenders');
|
|
t.ok(
|
|
childAppenders.some((a) => a.label === 'stdout1'),
|
|
'inherited stdout1'
|
|
);
|
|
t.ok(
|
|
childAppenders.some((a) => a.label === 'stdout1'),
|
|
'inherited stdout1'
|
|
);
|
|
|
|
const firstParentName = 'catA.catB';
|
|
const firstParentAppenders =
|
|
categories.appendersForCategory(firstParentName);
|
|
|
|
t.ok(firstParentAppenders);
|
|
t.equal(firstParentAppenders.length, 2, 'ended up with 2 appenders');
|
|
t.ok(
|
|
firstParentAppenders.some((a) => a.label === 'stdout1'),
|
|
'inherited stdout1'
|
|
);
|
|
t.ok(
|
|
firstParentAppenders.some((a) => a.label === 'stdout2'),
|
|
'kept stdout2'
|
|
);
|
|
|
|
t.end();
|
|
});
|
|
|
|
batch.test(
|
|
'should inherit appenders from deep parent with missing direct parent',
|
|
(t) => {
|
|
const config = {
|
|
appenders: {
|
|
stdout1: { type: 'dummy-appender', label: 'stdout1' },
|
|
stdout2: { type: 'dummy-appender', label: 'stdout2' },
|
|
},
|
|
categories: {
|
|
default: { appenders: ['stdout1'], level: 'ERROR' },
|
|
catA: { appenders: ['stdout1'], level: 'INFO' },
|
|
// no catA.catB, but should get created, with stdout1
|
|
'catA.catB.catC': { level: 'DEBUG' }, // should get stdout1
|
|
},
|
|
};
|
|
|
|
log4js.configure(config);
|
|
|
|
const childCategoryName = 'catA.catB.catC';
|
|
const childAppenders = categories.appendersForCategory(childCategoryName);
|
|
|
|
t.ok(childAppenders);
|
|
t.equal(childAppenders.length, 1, 'inherited 1 appenders');
|
|
t.ok(
|
|
childAppenders.some((a) => a.label === 'stdout1'),
|
|
'inherited stdout1'
|
|
);
|
|
|
|
const firstParentCategoryName = 'catA.catB';
|
|
const firstParentAppenders = categories.appendersForCategory(
|
|
firstParentCategoryName
|
|
);
|
|
|
|
t.ok(firstParentAppenders, 'catA.catB got created implicitily');
|
|
t.equal(
|
|
firstParentAppenders.length,
|
|
1,
|
|
'created with 1 inherited appender'
|
|
);
|
|
t.ok(
|
|
firstParentAppenders.some((a) => a.label === 'stdout1'),
|
|
'inherited stdout1'
|
|
);
|
|
|
|
t.end();
|
|
}
|
|
);
|
|
|
|
batch.test('should deal gracefully with missing parent', (t) => {
|
|
const config = {
|
|
appenders: {
|
|
stdout1: { type: 'dummy-appender', label: 'stdout1' },
|
|
stdout2: { type: 'dummy-appender', label: 'stdout2' },
|
|
},
|
|
categories: {
|
|
default: { appenders: ['stdout1'], level: 'ERROR' },
|
|
// no catA nor catA.catB, but should get created, with default values
|
|
'catA.catB.catC': { appenders: ['stdout2'], level: 'DEBUG' }, // should get stdout2, DEBUG
|
|
},
|
|
};
|
|
|
|
log4js.configure(config);
|
|
|
|
const childCategoryName = 'catA.catB.catC';
|
|
const childAppenders = categories.appendersForCategory(childCategoryName);
|
|
|
|
t.ok(childAppenders);
|
|
t.equal(childAppenders.length, 1);
|
|
t.ok(childAppenders.some((a) => a.label === 'stdout2'));
|
|
|
|
t.end();
|
|
});
|
|
|
|
batch.test(
|
|
'should not get duplicate appenders if parent has the same one',
|
|
(t) => {
|
|
const config = {
|
|
appenders: {
|
|
stdout1: { type: 'dummy-appender', label: 'stdout1' },
|
|
stdout2: { type: 'dummy-appender', label: 'stdout2' },
|
|
},
|
|
categories: {
|
|
default: { appenders: ['stdout1'], level: 'ERROR' },
|
|
catA: { appenders: ['stdout1', 'stdout2'], level: 'INFO' },
|
|
'catA.catB': { appenders: ['stdout1'], level: 'DEBUG' },
|
|
},
|
|
};
|
|
|
|
log4js.configure(config);
|
|
|
|
const childCategoryName = 'catA.catB';
|
|
const childAppenders = categories.appendersForCategory(childCategoryName);
|
|
|
|
t.ok(childAppenders);
|
|
t.equal(childAppenders.length, 2, 'inherited 1 appender');
|
|
t.ok(
|
|
childAppenders.some((a) => a.label === 'stdout1'),
|
|
'still have stdout1'
|
|
);
|
|
t.ok(
|
|
childAppenders.some((a) => a.label === 'stdout2'),
|
|
'inherited stdout2'
|
|
);
|
|
t.end();
|
|
}
|
|
);
|
|
|
|
batch.test('inherit:falses should disable inheritance', (t) => {
|
|
const config = {
|
|
appenders: {
|
|
stdout1: { type: 'dummy-appender', label: 'stdout1' },
|
|
stdout2: { type: 'dummy-appender', label: 'stdout2' },
|
|
},
|
|
categories: {
|
|
default: { appenders: ['stdout1'], level: 'ERROR' },
|
|
catA: { appenders: ['stdout1'], level: 'INFO' },
|
|
'catA.catB': { appenders: ['stdout2'], level: 'INFO', inherit: false }, // should not inherit from catA
|
|
},
|
|
};
|
|
|
|
log4js.configure(config);
|
|
|
|
const childCategoryName = 'catA.catB';
|
|
const childAppenders = categories.appendersForCategory(childCategoryName);
|
|
|
|
t.ok(childAppenders);
|
|
t.equal(childAppenders.length, 1, 'inherited no appender');
|
|
t.ok(
|
|
childAppenders.some((a) => a.label === 'stdout2'),
|
|
'kept stdout2'
|
|
);
|
|
|
|
t.end();
|
|
});
|
|
|
|
batch.test(
|
|
'inheritance should stop if direct parent has inherit off',
|
|
(t) => {
|
|
const config = {
|
|
appenders: {
|
|
stdout1: { type: 'dummy-appender', label: 'stdout1' },
|
|
stdout2: { type: 'dummy-appender', label: 'stdout2' },
|
|
},
|
|
categories: {
|
|
default: { appenders: ['stdout1'], level: 'ERROR' },
|
|
catA: { appenders: ['stdout1'], level: 'INFO' },
|
|
'catA.catB': {
|
|
appenders: ['stdout2'],
|
|
level: 'INFO',
|
|
inherit: false,
|
|
}, // should not inherit from catA
|
|
'catA.catB.catC': { level: 'DEBUG' }, // should inherit from catB only
|
|
},
|
|
};
|
|
|
|
log4js.configure(config);
|
|
|
|
const childCategoryName = 'catA.catB.catC';
|
|
const childAppenders = categories.appendersForCategory(childCategoryName);
|
|
|
|
t.ok(childAppenders);
|
|
t.equal(childAppenders.length, 1, 'inherited 1 appender');
|
|
t.ok(
|
|
childAppenders.some((a) => a.label === 'stdout2'),
|
|
'inherited stdout2'
|
|
);
|
|
|
|
const firstParentCategoryName = 'catA.catB';
|
|
const firstParentAppenders = categories.appendersForCategory(
|
|
firstParentCategoryName
|
|
);
|
|
|
|
t.ok(firstParentAppenders);
|
|
t.equal(firstParentAppenders.length, 1, 'did not inherit new appenders');
|
|
t.ok(
|
|
firstParentAppenders.some((a) => a.label === 'stdout2'),
|
|
'kept stdout2'
|
|
);
|
|
|
|
t.end();
|
|
}
|
|
);
|
|
|
|
batch.test('should inherit level when it is missing', (t) => {
|
|
const config = {
|
|
appenders: {
|
|
stdout1: { type: 'dummy-appender', label: 'stdout1' },
|
|
stdout2: { type: 'dummy-appender', label: 'stdout2' },
|
|
},
|
|
categories: {
|
|
default: { appenders: ['stdout1'], level: 'ERROR' },
|
|
catA: { appenders: ['stdout1'], level: 'INFO' },
|
|
// no catA.catB, but should get created, with stdout1, level INFO
|
|
'catA.catB.catC': {}, // should get stdout1, level INFO
|
|
},
|
|
};
|
|
|
|
log4js.configure(config);
|
|
|
|
const childCategoryName = 'catA.catB.catC';
|
|
const childLevel = categories.getLevelForCategory(childCategoryName);
|
|
|
|
t.equal(childLevel.levelStr, 'INFO', 'inherited level');
|
|
|
|
const firstParentCategoryName = 'catA.catB';
|
|
const firstParentLevel = categories.getLevelForCategory(
|
|
firstParentCategoryName
|
|
);
|
|
|
|
t.equal(
|
|
firstParentLevel.levelStr,
|
|
'INFO',
|
|
'generate parent inherited level from base'
|
|
);
|
|
|
|
t.end();
|
|
});
|
|
|
|
batch.end();
|
|
});
|