UNPKG

1.86 kBJavaScriptView Raw
1'use strict';
2
3var bunyan = require('bunyan');
4var chalk = require('chalk');
5var Writable = require('stream').Writable;
6
7var levelNames = {
8 10: 'TRACE',
9 20: 'DEBUG',
10 30: 'INFO ',
11 40: 'WARN ',
12 50: 'ERROR',
13 60: 'FATAL'
14};
15
16var levelColors = {
17 10: 'gray',
18 20: 'gray',
19 30: 'green',
20 40: 'bgYellow',
21 50: 'bgRed',
22 60: 'bgRed'
23};
24
25function ConsoleStream(env) {
26 Writable.call(this, {objectMode: true});
27
28 this.debug = env.debug;
29}
30
31require('util').inherits(ConsoleStream, Writable);
32
33ConsoleStream.prototype._write = function(data, enc, callback) {
34 var level = data.level;
35 var msg = '';
36
37 // Time
38 if (this.debug) {
39 msg += chalk.gray(formatTime(data.time)) + ' ';
40 }
41
42 // Level
43 msg += chalk[levelColors[level]](levelNames[level]) + ' ';
44
45 // Message
46 msg += data.msg + '\n';
47
48 // Error
49 if (data.err) {
50 var err = data.err.stack || data.err.message;
51 if (err) msg += chalk.yellow(err) + '\n';
52 }
53
54 if (level >= 40) {
55 process.stderr.write(msg);
56 } else {
57 process.stdout.write(msg);
58 }
59
60 callback();
61};
62
63function formatTime(date) {
64 return date.toISOString().substring(11, 23);
65}
66
67function createLogger(options) {
68 options = options || {};
69
70 var streams = [];
71
72 if (!options.silent) {
73 streams.push({
74 type: 'raw',
75 level: options.debug ? 'trace' : 'info',
76 stream: new ConsoleStream(options)
77 });
78 }
79
80 if (options.debug) {
81 streams.push({
82 level: 'trace',
83 path: 'debug.log'
84 });
85 }
86
87 var logger = bunyan.createLogger({
88 name: options.name || 'hexo',
89 streams: streams,
90 serializers: {
91 err: bunyan.stdSerializers.err
92 }
93 });
94
95 // Alias for logger levels
96 logger.d = logger.debug;
97 logger.i = logger.info;
98 logger.w = logger.warn;
99 logger.e = logger.error;
100 logger.log = logger.info;
101
102 return logger;
103}
104
105module.exports = createLogger;