1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 | 'use strict';
|
22 |
|
23 | var xtend = require('xtend');
|
24 | var dotty = require('dotty');
|
25 |
|
26 | var defaultLevels = require('./default-levels.js');
|
27 | var makeLogMethod = require('./log-method');
|
28 | var errors = require('./errors');
|
29 |
|
30 | module.exports = ChildLogger;
|
31 |
|
32 | function ChildLogger(config) {
|
33 | this.mainLogger = config.mainLogger;
|
34 | this.path = config.path;
|
35 | if (config.extendMeta && !(config.meta || config.metaFilter)) {
|
36 | throw errors.MetaRequired;
|
37 | }
|
38 | this.extendMeta = config.extendMeta;
|
39 | this.meta = config.meta || {};
|
40 | this.strict = config.strict;
|
41 | this.metaFilter = config.metaFilter || [];
|
42 |
|
43 | this.metaFilter.forEach(function validateFilter(filter) {
|
44 | if (!filter || !filter.object || typeof filter.object !== 'object') {
|
45 | throw errors.FilterObjectRequired();
|
46 | }
|
47 | if (!filter.mappings || typeof filter.mappings !== 'object') {
|
48 | throw errors.FilterMappingsRequired();
|
49 | }
|
50 | Object.keys(filter.mappings).forEach(function validateMappings(srcName) {
|
51 | var dstName = filter.mappings[srcName];
|
52 | if (typeof dstName !== 'string') {
|
53 | throw errors.FilterBadDst();
|
54 | }
|
55 | });
|
56 | });
|
57 |
|
58 | var levels = config.levels || defaultLevels;
|
59 | Object.keys(levels).forEach(function (levelName) {
|
60 | if (!this.mainLogger.levels.hasOwnProperty(levelName)) {
|
61 | if (this.strict) {
|
62 | throw errors.LevelRequired({level: levelName});
|
63 | } else {
|
64 | this[levelName] = noop;
|
65 | this.mainLogger.warn('Child Logger Disabled level',
|
66 | {level: levelName});
|
67 | }
|
68 | } else {
|
69 | this[levelName] = makeLogMethod(levelName);
|
70 | }
|
71 | }, this);
|
72 | }
|
73 |
|
74 | ChildLogger.prototype.writeEntry = function writeEntry(entry, callback) {
|
75 | if (this.extendMeta) {
|
76 | var filteredMeta = {};
|
77 | this.metaFilter.forEach(function readFilter(filter) {
|
78 | var obj = filter.object;
|
79 | Object.keys(filter.mappings).forEach(function readMapping(srcName) {
|
80 | var dstName = filter.mappings[srcName];
|
81 | dotty.put(filteredMeta, dstName, dotty.get(obj, srcName));
|
82 | });
|
83 | }, this);
|
84 |
|
85 | entry.meta = xtend(this.meta, filteredMeta, entry.meta);
|
86 | }
|
87 | this.mainLogger.writeEntry(entry, callback);
|
88 | };
|
89 |
|
90 | ChildLogger.prototype.createChild = function createChild(subPath, levels, options) {
|
91 | return this.mainLogger.createChild(this.path + '.' + subPath, levels, options);
|
92 | };
|
93 |
|
94 | function noop() {}
|