'use strict'; const os = require('os'); const utils = require('../utils'); const levels = require('../level'); const ENABLED = Symbol('Transport#enabled'); /** * Transport is an output channel of the log that can be output to a file, console or service. * A {@link Logger} can configure multiple Transports to meet a variety of complex needs */ class Transport { /** * @class * @param {Object} options * - {String} [level = NONE] - log level. ouput method must higher than this option. if level is `info`, `debug` will disabled * - {Function} formatter - format function * - {Function} contextFormatter - format function for context logger * - {Boolean} [json = false] - log format is json or not * - {String} [encoding = utf8] - log encodeing, see {@link https://github.com/ashtuchkin/iconv-lite#supported-encodings} * - {String} [eol = os.EOL] - end of line */ constructor(options) { this.options = utils.assign(this.defaults, options); if (this.options.encoding === 'utf-8') { this.options.encoding = 'utf8'; } this.options.level = utils.normalizeLevel(this.options.level); this[ENABLED] = true; } get defaults() { return { level: 'NONE', formatter: null, contextFormatter: null, json: false, encoding: 'utf8', eol: os.EOL, }; } /** * enable or not * @return {[type]} [description] */ get enabled() { return this[ENABLED]; } /** * enable transport */ enable() { this[ENABLED] = true; } /** * disable transport */ disable() { this[ENABLED] = false; } set level(level) { this.options.level = utils.normalizeLevel(level); } get level() { return this.options.level; } /** * should output log or not * @param {String} level log level, must in upper case * @return {Boolean} should or not */ shouldLog(level) { if (!this[ENABLED]) { return false; } if (this.options.level === levels['NONE']) { return false; } return this.options.level <= levels[level]; } /** * Transport log method * @param {String} level - log level * @param {Array} args - all methods * @param {Object} meta - meta infomations * @return {Buffer|String} log message * - empty string means no log * - utf8 encoding return String * - other encoding return Buffer */ log(level, args, meta) { return utils.format(level, args, meta, this.options); } /** * reload Transport */ reload() {} /** * close Transport */ close() {} end() {} } module.exports = Transport;