123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- 'use strict';
- const ChildProcess = require('child_process').ChildProcess;
- const Console = require('console').Console;
- const through = require('through2');
- const split = require('split2');
- const pumpify = require('pumpify');
- const defaults = {
- stdout: process.stdout,
- stderr: process.stderr,
- prefix: '',
- time: true,
- };
- /**
- * log/debug/info -> this.stdout(pad) -> opt.stdout
- * warn/error -> this.stderr(pad) -> opt.stderr
- */
- class Logger extends Console {
- constructor(options) {
- options = Object.assign({}, defaults, options);
- const stdout = padStream(() => this._getPrefix());
- const stderr = padStream(() => this._getPrefix());
- super(stdout, stderr);
- this.stdout = stdout;
- this.stderr = stderr;
- this.options = options;
- stdout.setMaxListeners(100);
- stderr.setMaxListeners(100);
- stdout.pipe(options.stdout);
- stderr.pipe(options.stderr);
- }
- child(obj, prefix) {
- // child('> ')
- if (typeof obj === 'string') {
- prefix = obj;
- obj = null;
- }
- // obj -> child.stdout/stderr(pad) -> this.stdout/stderr(pad) -> opt.stdout
- const child = new Logger({
- stdout: this.stdout,
- stderr: this.stderr,
- time: false,
- prefix: prefix || '',
- });
- if (obj) {
- if (obj instanceof ChildProcess) {
- obj.stdout.pipe(child.stdout, { end: false });
- obj.stderr.pipe(child.stderr, { end: false });
- } else if (obj.pipe) {
- obj.pipe(child.stdout, { end: false });
- }
- }
- return child;
- }
- end() {
- this.stdout.end();
- this.stderr.end();
- }
- _getPrefix() {
- let prefix = this.options.prefix;
- if (typeof prefix === 'function') {
- prefix = prefix();
- }
- if (!this.options.time) return prefix;
- const d = new Date();
- let hours = d.getHours();
- if (hours < 10) {
- hours = '0' + hours;
- }
- let mintues = d.getMinutes();
- if (mintues < 10) {
- mintues = '0' + mintues;
- }
- let seconds = d.getSeconds();
- if (seconds < 10) {
- seconds = '0' + seconds;
- }
- return `[${hours}:${mintues}:${seconds}] ${prefix}`;
- }
- }
- module.exports = Logger;
- function padStream(prefix) {
- return pumpify(split(), through(function(data, enc, cb) {
- this.push(prefix());
- this.push(data);
- this.push('\n');
- cb();
- }));
- }
|