1 |
|
2 | 'use strict';
|
3 |
|
4 | var path = require('path');
|
5 | var eachModule = require('each-module');
|
6 | var winston = require('winston');
|
7 |
|
8 | module.exports = function (config) {
|
9 | var moduleLoadErrors = [];
|
10 |
|
11 | var getArrayOfValidModulesByDirName = function (finalDir) {
|
12 | var modules = [];
|
13 | var modulePusher = function (moduleName, moduleExports, file) {
|
14 | if (typeof moduleExports === 'function') {
|
15 | modules.push(moduleExports);
|
16 | } else {
|
17 | moduleLoadErrors.push('Invalid module dropped ' + file);
|
18 | }
|
19 | };
|
20 |
|
21 |
|
22 | var locations = [config.path.root, config.path.shunterRoot];
|
23 | for (var i = 0; i < locations.length; i++) {
|
24 | var localPath = path.join(locations[i], config.structure.logging, finalDir);
|
25 | eachModule(localPath, modulePusher);
|
26 | if (modules.length > 0) {
|
27 | break;
|
28 | }
|
29 | }
|
30 | return modules;
|
31 | };
|
32 |
|
33 | return {
|
34 | getLogger: function () {
|
35 | var validateTransports = function (arModules) {
|
36 | return arModules.map(function (fnModule) {
|
37 | return fnModule(config);
|
38 | }).filter(function (obModule) {
|
39 | return Boolean(obModule);
|
40 | });
|
41 | };
|
42 |
|
43 | var validateFilters = function (arModules) {
|
44 | return arModules.filter(function (fnModule) {
|
45 | return typeof fnModule('debug', 'a message') === 'string';
|
46 | });
|
47 | };
|
48 |
|
49 | var transports = getArrayOfValidModulesByDirName(config.structure.loggingTransports);
|
50 | var filters = getArrayOfValidModulesByDirName(config.structure.loggingFilters);
|
51 |
|
52 | var loggerInstance = new winston.Logger({
|
53 | transports: validateTransports(transports),
|
54 | filters: validateFilters(filters)
|
55 | });
|
56 |
|
57 | moduleLoadErrors.forEach(function (err) {
|
58 | loggerInstance.error(err);
|
59 | });
|
60 |
|
61 | return loggerInstance;
|
62 | }
|
63 | };
|
64 | };
|