UNPKG

2.63 kBJavaScriptView Raw
1var EventEmitter = require('events').EventEmitter;
2var Stream = require('stream');
3var util = require('util');
4var colors = require('colors');
5var Strftime = require('strftime');
6var ObjectStream = require('zetta-streams').ObjectStream;
7
8var LEVELS = ['log', 'info', 'warn', 'error'];
9
10function Logger(options) {
11 EventEmitter.call(this);
12 this.options = options || {};
13 this.pubsub = this.options.pubsub;
14}
15util.inherits(Logger, EventEmitter);
16
17LEVELS.forEach(function(level) {
18 Logger.prototype[level] = function(event, msg, data) {
19 this.emit(level, event, msg, data);
20 };
21});
22
23/*
24 * Logger intercepts messages sent from all over the fog runtime. We format them accordingly.
25 *
26 */
27Logger.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 // add timestamp if it does not exist.
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
62Logger.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; // only used for objectstream messages
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
84function 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
101var logger = null;
102module.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
113module.exports.LEVELS = LEVELS;
114module.exports.ConsoleOutput = ConsoleOutput;