1 | var EventEmitter = require('events').EventEmitter;
|
2 | var Stream = require('stream');
|
3 | var util = require('util');
|
4 | var colors = require('colors');
|
5 | var Strftime = require('strftime');
|
6 | var ObjectStream = require('zetta-streams').ObjectStream;
|
7 |
|
8 | var LEVELS = ['log', 'info', 'warn', 'error'];
|
9 |
|
10 | function Logger(options) {
|
11 | EventEmitter.call(this);
|
12 | this.options = options || {};
|
13 | this.pubsub = this.options.pubsub;
|
14 | }
|
15 | util.inherits(Logger, EventEmitter);
|
16 |
|
17 | LEVELS.forEach(function(level) {
|
18 | Logger.prototype[level] = function(event, msg, data) {
|
19 | this.emit(level, event, msg, data);
|
20 | };
|
21 | });
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 | Logger.prototype.init = function() {
|
28 | var self = this;
|
29 |
|
30 | this.removeAllListeners();
|
31 |
|
32 | LEVELS.slice(1).forEach(function(level) {
|
33 | self.on(level, function(event, msg, data) {
|
34 | if (!event || !msg) {
|
35 | return;
|
36 | }
|
37 |
|
38 | if (typeof data !== 'object') {
|
39 | data = {
|
40 | timestamp: new Date().getTime()
|
41 | };
|
42 | }
|
43 |
|
44 |
|
45 | if (!data.timestamp) {
|
46 | data.timestamp = new Date().getTime();
|
47 | }
|
48 |
|
49 | self.emit('message', level, event, msg, data);
|
50 |
|
51 | if (self.pubsub) {
|
52 | self._sendToPubsub(level, event, msg, data);
|
53 | }
|
54 | });
|
55 | });
|
56 |
|
57 | this.on('log', function(event, msg, data) {
|
58 | self.emit('info', event, msg, data);
|
59 | });
|
60 | };
|
61 |
|
62 | Logger.prototype._sendToPubsub = function(level, event, msg, data) {
|
63 | if (!data) {
|
64 | data = {};
|
65 | }
|
66 |
|
67 | var obj = ObjectStream.format((data.topic || 'logs'), null);
|
68 | delete obj.data;
|
69 |
|
70 | Object.keys(data).forEach(function(key) {
|
71 | obj[key] = data[key];
|
72 | });
|
73 |
|
74 | if (msg) {
|
75 | obj.msg = msg;
|
76 | }
|
77 |
|
78 | obj.level = level;
|
79 | obj.event = event;
|
80 |
|
81 | this.pubsub.publish('logs', obj);
|
82 | };
|
83 |
|
84 | function ConsoleOutput(log) {
|
85 |
|
86 | function format(level, event, msg, d) {
|
87 | var dateStr = Strftime('%b-%d-%Y %H:%M:%S ', new Date(d.timestamp)).green;
|
88 | msg = '[' + event + '] ' + msg;
|
89 | if (level === 'info' || level === 'log') {
|
90 | console.log(dateStr + msg.blue);
|
91 | } else if(level === 'warn') {
|
92 | console.log(dateStr + msg.yellow);
|
93 | } else if (level === 'error') {
|
94 | console.error(dateStr + msg.red);
|
95 | }
|
96 | }
|
97 |
|
98 | log.on('message', format);
|
99 | };
|
100 |
|
101 | var logger = null;
|
102 | module.exports = function() {
|
103 | if(logger) {
|
104 | return logger;
|
105 | } else {
|
106 | logger = Object.create(Logger.prototype);
|
107 | logger.constructor.apply(logger, arguments);
|
108 | logger.init();
|
109 | return logger;
|
110 | }
|
111 | };
|
112 |
|
113 | module.exports.LEVELS = LEVELS;
|
114 | module.exports.ConsoleOutput = ConsoleOutput;
|