var LogAdapter = require('./adapter'); var LogWriter = require('./writer'); var LoggerSystem = class LoggerSystem { constructor() { this.adapters = []; this.writers = {}; this.loggerLevels = {}; // Prepare TAGS // Global log count? per log // Stuff to replace this.logFmt = "[%c]:%t: %m %e"; } writer(name,writer) { this.writers[name]= writer; } adapter(adapter) { if(!adapter instanceof LogAdapter) { throw Error("Should be an adapter"); } this.adapters.push(adapter); return adapter; } clear() { this.adapters = []; } solveLevels(logger,levels) { // If emptu all ok for(var k in levels) { if(logger.name.match(new RegExp("^" + k + "$"))) { return levels[k]; } } return null; } base(logger,TAG,msg) { var self = this; var sTAG = LoggerSystem.TAGS[TAG]; var gLevels = this.solveLevels(logger,this.loggerLevels); for(var a of this.adapters) { var aLevels = this.solveLevels(logger,a.loggerLevels); if(aLevels && !aLevels.includes(sTAG)) { return; } if(gLevels && !gLevels.includes(sTAG)) { return; } // is performance good? // Check if this adapter has conf if(a.filterFunc(TAG)) { a.writers.forEach(function(w) { var fmt = a.fmt; if(fmt==undefined ) { if(w.fmt != undefined && w.fmt[sTAG] != undefined) { fmt = w.fmt[LoggerSystem.TAGS[TAG]]; } } var outmsg = self.format(TAG,w.count,logger.name,w.lastTime,logger.lastTime,fmt,msg); // Strip ansi if any w.doLog(outmsg); }); } }; } // Improve and clean this format(TAG,count,name,lastDate, lastLoggerDate, fmt, msg) { if(fmt == undefined) fmt = this.logFmt; // Overall default format var now = new Date(); var dateStr = (("0" + now.getDate()).slice(-2) + "-" + ("0" +now.getMonth()).slice(-2) + "-" + now.getFullYear() + " " + ("0" + now.getHours()).slice(-2) + ":" + ("0" + now.getMinutes()).slice(-2) + ":" + ("0"+now.getSeconds()).slice(-2)) ; var dateDiff = (now - lastDate); var dateDiffStr = dateDiff + "ms"; if(dateDiff>1000) dateDiffStr = (dateDiff / 1000).toFixed(2) + "s"; var ldateDiffhr = process.hrtime(lastLoggerDate); var ldateDiff = ( ldateDiffhr[0] * 1000000 + ldateDiffhr[1] / 1000 ) / 1000; var ldateDiffStr = ""; if(ldateDiff > 1000) ldateDiffStr = (ldateDiff / 1000).toFixed(2) + "s"; else { ldateDiffStr = ldateDiff.toFixed(2) +"ms"; } var s = fmt; s = s.replace(/%c/g,count); s = s.replace(/%m/g,msg); s = s.replace(/%l/g,LoggerSystem.TAGS[TAG]); s = s.replace(/%n/g,name); s = s.replace(/%e/g,"+" +dateDiffStr); s = s.replace(/%E/g,"+" +ldateDiffStr); s = s.replace(/%t/g,dateStr); s = s.replace(/%%/g,"%"); s = s.replace(/%a/g,"\x1b"); var logSplit = s.split("%|"); // Might be sloooww if(logSplit.length == 2) { var ansiRegex = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; var llen = logSplit[0].replace(ansiRegex,"").length; var rlen = logSplit[1].replace(ansiRegex,"").length+1; // Only works if it has columns else just give some default var col = process.stdout.columns || 80; var pad = col - llen -rlen; s = logSplit[0]; for(var i = 0;i