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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
var _ = require('lodash');
var util = require('util');
var color = require('bash-color');
var LEVELS = {
DEBUG: 0,
INFO: 1,
WARN: 2,
ERROR: 3,
DISABLED: 10
};
var COLORS = {
DEBUG: color.purple,
INFO: color.cyan,
WARN: color.yellow,
ERROR: color.red
};
function Logger(write, logLevel) {
if (!(this instanceof Logger)) return new Logger(write, logLevel);
this._write = write || function(msg) { process.stdout.write(msg); };
this.lastChar = '\n';
// Define log level
this.setLevel(logLevel);
_.bindAll(this);
// Create easy-to-use method like "logger.debug.ln('....')"
_.each(_.omit(LEVELS, 'DISABLED'), function(level, levelKey) {
levelKey = levelKey.toLowerCase();
this[levelKey] = _.partial(this.log, level);
this[levelKey].ln = _.partial(this.logLn, level);
this[levelKey].ok = _.partial(this.ok, level);
this[levelKey].fail = _.partial(this.fail, level);
this[levelKey].promise = _.partial(this.promise, level);
}, this);
}
// Change minimum level
Logger.prototype.setLevel = function(logLevel) {
if (_.isString(logLevel)) logLevel = LEVELS[logLevel.toUpperCase()];
this.logLevel = logLevel;
};
// Print a simple string
Logger.prototype.write = function(msg) {
msg = msg.toString();
this.lastChar = _.last(msg);
return this._write(msg);
};
// Format a string using the first argument as a printf-like format.
Logger.prototype.format = function() {
return util.format.apply(util, arguments);
};
// Print a line
Logger.prototype.writeLn = function(msg) {
return this.write((msg || '')+'\n');
};
// Log/Print a message if level is allowed
Logger.prototype.log = function(level) {
if (level < this.logLevel) return;
var levelKey = _.findKey(LEVELS, function(v) { return v == level; });
var args = Array.prototype.slice.apply(arguments, [1]);
var msg = this.format.apply(this, args);
if (this.lastChar == '\n') {
msg = COLORS[levelKey](levelKey.toLowerCase()+':')+' '+msg;
}
return this.write(msg);
};
// Log/Print a line if level is allowed
Logger.prototype.logLn = function() {
if (this.lastChar != '\n') this.write('\n');
var args = Array.prototype.slice.apply(arguments);
args.push('\n');
return this.log.apply(this, args);
};
// Log a confirmation [OK]
Logger.prototype.ok = function(level) {
var args = Array.prototype.slice.apply(arguments, [1]);
var msg = this.format.apply(this, args);
if (arguments.length > 1) {
this.logLn(level, color.green('>> ') + msg.trim().replace(/\n/g, color.green('\n>> ')));
} else {
this.log(level, color.green('OK'), '\n');
}
};
// Log a "FAIL"
Logger.prototype.fail = function(level) {
return this.log(level, color.red('ERROR') + '\n');
};
// Log state of a promise
Logger.prototype.promise = function(level, p) {
var that = this;
return p.
then(function(st) {
that.ok(level);
return st;
}, function(err) {
that.fail(level);
throw err;
});
};
Logger.LEVELS = LEVELS;
Logger.COLORS = COLORS;
module.exports = Logger;
|