-
Notifications
You must be signed in to change notification settings - Fork 0
/
logger.js
106 lines (94 loc) · 2.67 KB
/
logger.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
* requires node 6.9
*
* API:
* default logger has the same methods signatures as console
*
* //
* var logger = rootRequire('logger');
* logger.debug('toto');
* // [DEBUG]: toto
* var rl = logger.prefix('REQUEST');
* rl.log('toto');
* // [INFO]: [REQUEST]: toto
*
*
* can be improved :
* - winston should be instantiate in constructor
*/
const winston = require('winston');
const util = require('util');
const logger = new (winston.Logger)({
exitOnError: false,
transports: [
new (winston.transports.Console)({
level: 'debug',
formatter: (options) => {
const meta = (options.meta && Object.keys(options.meta).length !== 0) ? ' ' + util.inspect(options.meta) : '';
return '['+options.level.toUpperCase() +']: ' +
(options.message || '') +
meta;
}
})
]
});
// on se base sur syslog
// { emerg: 0, alert: 1, crit: 2, error: 3, warning: 4, notice: 5, info: 6, debug: 7 }
logger.setLevels(winston.config.syslog.levels);
// shouldn't be tight coupled, but we don't mind yet...
const statsd = rootRequire('statsd');
const metrics = { /* level: num */ };
setInterval(() => {
Object.keys(metrics).forEach((level) => {
if (metrics[level]) {
statsd.client.increment('logger.'+level, metrics[level]);
metrics[level] = 0;
}
});
}, 1000);
class L {
constructor(options) {
options = options || {};
this.prefixedArgs = options.prefixedArgs || [];
this.disableMetrics = options.disableMetrics || false;
}
custom(level, ...params) {
// winston
logger.log(level, ...params);
// metrics
if (metrics && !this.disableMetrics) {
metrics[level] = (metrics[level] || 0) + 1;
}
}
_squashPrefixIntoFirstArgument(first, ...rest) {
const prefix = this.prefixedArgs.map(p => '[' + p + ']: ').join('');
if (typeof first === 'string') {
return [ prefix + first, ...rest ];
} else {
return [ prefix, first, ...rest ];
}
}
debug() {
const newArguments = this._squashPrefixIntoFirstArgument(...arguments);
this.custom('debug', ...newArguments);
}
log() {
const newArguments = this._squashPrefixIntoFirstArgument(...arguments);
this.custom('info', ...newArguments);
}
warn() {
const newArguments = this._squashPrefixIntoFirstArgument(...arguments);
this.custom('warning', ...newArguments);
}
error() {
const newArguments = this._squashPrefixIntoFirstArgument(...arguments);
this.custom('error', ...newArguments);
}
prefix() {
return new L({
prefixedArgs: this.prefixedArgs.concat(Array.from(arguments)),
disableMetrics: this.disableMetrics
});
}
}
module.exports = new L();