system.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. var LogAdapter = require('./adapter');
  2. var LogWriter = require('./writer');
  3. var LoggerSystem = class LoggerSystem {
  4. constructor() {
  5. this.adapters = [];
  6. this.writers = {};
  7. this.loggerLevels = {};
  8. // Prepare TAGS
  9. // Global log count? per log
  10. // Stuff to replace
  11. this.logFmt = "[%c]:%t: %m %e";
  12. }
  13. writer(name,writer) {
  14. this.writers[name]= writer;
  15. }
  16. adapter(adapter) {
  17. if(!adapter instanceof LogAdapter) {
  18. throw Error("Should be an adapter");
  19. }
  20. this.adapters.push(adapter);
  21. return adapter;
  22. }
  23. clear() {
  24. this.adapters = [];
  25. }
  26. solveLevels(logger,levels) {
  27. // If emptu all ok
  28. for(var k in levels) {
  29. if(logger.name.match(new RegExp("^" + k + "$"))) {
  30. return levels[k];
  31. }
  32. }
  33. return null;
  34. }
  35. base(logger,TAG,msg) {
  36. var self = this;
  37. var sTAG = LoggerSystem.TAGS[TAG];
  38. var gLevels = this.solveLevels(logger,this.loggerLevels);
  39. for(var a of this.adapters) {
  40. var aLevels = this.solveLevels(logger,a.loggerLevels);
  41. if(aLevels && !aLevels.includes(sTAG)) {
  42. return;
  43. }
  44. if(gLevels && !gLevels.includes(sTAG)) {
  45. return;
  46. }
  47. // is performance good?
  48. // Check if this adapter has conf
  49. if(a.filterFunc(TAG)) {
  50. a.writers.forEach(function(w) {
  51. var fmt = a.fmt;
  52. if(fmt==undefined ) {
  53. if(w.fmt != undefined && w.fmt[sTAG] != undefined) {
  54. fmt = w.fmt[LoggerSystem.TAGS[TAG]];
  55. }
  56. }
  57. var outmsg = self.format(TAG,w.count,logger.name,w.lastTime,logger.lastTime,fmt,msg);
  58. // Strip ansi if any
  59. w.doLog(outmsg);
  60. });
  61. }
  62. };
  63. }
  64. // Improve and clean this
  65. format(TAG,count,name,lastDate, lastLoggerDate, fmt, msg) {
  66. if(fmt == undefined) fmt = this.logFmt; // Overall default format
  67. var now = new Date();
  68. var dateStr = (("0" + now.getDate()).slice(-2)
  69. + "-" + ("0" +now.getMonth()).slice(-2)
  70. + "-" + now.getFullYear()
  71. + " " + ("0" + now.getHours()).slice(-2)
  72. + ":" + ("0" + now.getMinutes()).slice(-2)
  73. + ":" + ("0"+now.getSeconds()).slice(-2)) ;
  74. var dateDiff = (now - lastDate);
  75. var dateDiffStr = dateDiff + "ms";
  76. if(dateDiff>1000) dateDiffStr = (dateDiff / 1000).toFixed(2) + "s";
  77. var ldateDiffhr = process.hrtime(lastLoggerDate);
  78. var ldateDiff = ( ldateDiffhr[0] * 1000000 + ldateDiffhr[1] / 1000 ) / 1000;
  79. var ldateDiffStr = "";
  80. if(ldateDiff > 1000)
  81. ldateDiffStr = (ldateDiff / 1000).toFixed(2) + "s";
  82. else {
  83. ldateDiffStr = ldateDiff.toFixed(2) +"ms";
  84. }
  85. var s = fmt;
  86. s = s.replace(/%c/g,count);
  87. s = s.replace(/%m/g,msg);
  88. s = s.replace(/%l/g,LoggerSystem.TAGS[TAG]);
  89. s = s.replace(/%n/g,name);
  90. s = s.replace(/%e/g,"+" +dateDiffStr);
  91. s = s.replace(/%E/g,"+" +ldateDiffStr);
  92. s = s.replace(/%t/g,dateStr);
  93. s = s.replace(/%%/g,"%");
  94. s = s.replace(/%a/g,"\x1b");
  95. var logSplit = s.split("%|");
  96. // Might be sloooww
  97. if(logSplit.length == 2) {
  98. var ansiRegex = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
  99. var llen = logSplit[0].replace(ansiRegex,"").length;
  100. var rlen = logSplit[1].replace(ansiRegex,"").length+1;
  101. // Only works if it has columns else just give some default
  102. var col = process.stdout.columns || 80;
  103. var pad = col - llen -rlen;
  104. s = logSplit[0];
  105. for(var i = 0;i<pad;i++) { s+=" "; }
  106. s+= " "+logSplit[1];
  107. }
  108. return s;
  109. }
  110. }
  111. LoggerSystem.TAGS = ["ERROR","WARN","INFO","VERBOSE"];
  112. module.exports = LoggerSystem;