1 | (function (root, factory) {
|
2 | if (typeof define === 'function' && define.amd) {
|
3 | define(factory);
|
4 | } else if (typeof module === 'object' && module.exports) {
|
5 | module.exports = factory();
|
6 | } else {
|
7 | root.prefix = factory(root);
|
8 | }
|
9 | }(this, function (root) {
|
10 | 'use strict';
|
11 |
|
12 | var merge = function merge(target) {
|
13 | var i = 1;
|
14 | var length = arguments.length;
|
15 | var key;
|
16 | for (; i < length; i++) {
|
17 | for (key in arguments[i]) {
|
18 | if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
|
19 | target[key] = arguments[i][key];
|
20 | }
|
21 | }
|
22 | }
|
23 | return target;
|
24 | };
|
25 |
|
26 | var defaults = {
|
27 | template: '[%t] %l:',
|
28 | timestampFormatter: function (date) {
|
29 | return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, '$1');
|
30 | },
|
31 | levelFormatter: function (level) {
|
32 | return level.toUpperCase();
|
33 | },
|
34 | nameFormatter: function (name) {
|
35 | return name || 'root';
|
36 | }
|
37 | };
|
38 |
|
39 | var loggers = {};
|
40 |
|
41 | var apply = function apply(logger, config) {
|
42 | if (!logger || !logger.setLevel) {
|
43 | throw new TypeError('Argument is not a logger');
|
44 | }
|
45 |
|
46 |
|
47 | var isRoot = !!logger.getLogger;
|
48 | var originalFactory = logger.methodFactory;
|
49 | var name = logger.name || '';
|
50 | var parent = loggers[name] || loggers[''] || defaults;
|
51 |
|
52 |
|
53 | function methodFactory(methodName, logLevel, loggerName) {
|
54 | var originalMethod = originalFactory(methodName, logLevel, loggerName);
|
55 | var options = loggers[loggerName || ''];
|
56 |
|
57 | var hasTimestamp = options.template.indexOf('%t') !== -1;
|
58 | var hasLevel = options.template.indexOf('%l') !== -1;
|
59 | var hasName = options.template.indexOf('%n') !== -1;
|
60 |
|
61 | return function () {
|
62 | var content = options.template;
|
63 |
|
64 | var length = arguments.length;
|
65 | var args = Array(length);
|
66 | var key = 0;
|
67 | for (; key < length; key++) {
|
68 | args[key] = arguments[key];
|
69 | }
|
70 |
|
71 | if (!(isRoot && loggers[loggerName])) {
|
72 | if (hasTimestamp) content = content.replace(/%t/, options.timestampFormatter(new Date()));
|
73 | if (hasLevel) content = content.replace(/%l/, options.levelFormatter(methodName));
|
74 | if (hasName) content = content.replace(/%n/, options.nameFormatter(loggerName));
|
75 |
|
76 | if (args.length && typeof args[0] === 'string') {
|
77 |
|
78 | args[0] = '' + content + ' ' + args[0];
|
79 | } else {
|
80 | args.unshift(content);
|
81 | }
|
82 | }
|
83 |
|
84 | originalMethod.apply(undefined, args);
|
85 | };
|
86 | }
|
87 |
|
88 | if (!loggers[name]) {
|
89 | logger.methodFactory = methodFactory;
|
90 | }
|
91 | loggers[name] = merge({}, parent, config);
|
92 |
|
93 | logger.setLevel(logger.getLevel());
|
94 | return logger;
|
95 | };
|
96 |
|
97 | var api = {
|
98 | apply: apply
|
99 | };
|
100 |
|
101 | var save;
|
102 | if (root) {
|
103 | save = root.prefix;
|
104 | api.noConflict = function () {
|
105 | if (root.prefix === api) {
|
106 | root.prefix = save;
|
107 | }
|
108 | return api;
|
109 | };
|
110 | }
|
111 |
|
112 | return api;
|
113 | }));
|