1 | 'use strict';
|
2 |
|
3 | var bunyan = require('bunyan');
|
4 | var chalk = require('chalk');
|
5 | var Writable = require('stream').Writable;
|
6 |
|
7 | var levelNames = {
|
8 | 10: 'TRACE',
|
9 | 20: 'DEBUG',
|
10 | 30: 'INFO ',
|
11 | 40: 'WARN ',
|
12 | 50: 'ERROR',
|
13 | 60: 'FATAL'
|
14 | };
|
15 |
|
16 | var levelColors = {
|
17 | 10: 'gray',
|
18 | 20: 'gray',
|
19 | 30: 'green',
|
20 | 40: 'bgYellow',
|
21 | 50: 'bgRed',
|
22 | 60: 'bgRed'
|
23 | };
|
24 |
|
25 | function ConsoleStream(env) {
|
26 | Writable.call(this, {objectMode: true});
|
27 |
|
28 | this.debug = env.debug;
|
29 | }
|
30 |
|
31 | require('util').inherits(ConsoleStream, Writable);
|
32 |
|
33 | ConsoleStream.prototype._write = function(data, enc, callback) {
|
34 | var level = data.level;
|
35 | var msg = '';
|
36 |
|
37 |
|
38 | if (this.debug) {
|
39 | msg += chalk.gray(formatTime(data.time)) + ' ';
|
40 | }
|
41 |
|
42 |
|
43 | msg += chalk[levelColors[level]](levelNames[level]) + ' ';
|
44 |
|
45 |
|
46 | msg += data.msg + '\n';
|
47 |
|
48 |
|
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 |
|
63 | function formatTime(date) {
|
64 | return date.toISOString().substring(11, 23);
|
65 | }
|
66 |
|
67 | function 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 |
|
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 |
|
105 | module.exports = createLogger;
|