logger.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /* eslint-disable no-console */
  2. /**
  3. * Logger used throughout the application to allow configuration of
  4. * the log level required for the messages.
  5. */
  6. export class Logger {
  7. static _CheckLimit(message, limit) {
  8. let entry = Logger._LogLimitOutputs[message];
  9. if (!entry) {
  10. entry = { limit, current: 1 };
  11. Logger._LogLimitOutputs[message] = entry;
  12. }
  13. else {
  14. entry.current++;
  15. }
  16. return entry.current <= entry.limit;
  17. }
  18. static _GenerateLimitMessage(message, level = 1) {
  19. const entry = Logger._LogLimitOutputs[message];
  20. if (!entry || !Logger.MessageLimitReached) {
  21. return;
  22. }
  23. const type = this._Levels[level];
  24. if (entry.current === entry.limit) {
  25. Logger[type.name](Logger.MessageLimitReached.replace(/%LIMIT%/g, "" + entry.limit).replace(/%TYPE%/g, type.name ?? ""));
  26. }
  27. }
  28. static _AddLogEntry(entry) {
  29. Logger._LogCache = entry + Logger._LogCache;
  30. if (Logger.OnNewCacheEntry) {
  31. Logger.OnNewCacheEntry(entry);
  32. }
  33. }
  34. static _FormatMessage(message) {
  35. const padStr = (i) => (i < 10 ? "0" + i : "" + i);
  36. const date = new Date();
  37. return "[" + padStr(date.getHours()) + ":" + padStr(date.getMinutes()) + ":" + padStr(date.getSeconds()) + "]: " + message;
  38. }
  39. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  40. static _LogDisabled(message, limit) {
  41. // nothing to do
  42. }
  43. static _LogEnabled(level = 1, message, limit) {
  44. // take first message if array
  45. const msg = Array.isArray(message) ? message[0] : message;
  46. if (limit !== undefined && !Logger._CheckLimit(msg, limit)) {
  47. return;
  48. }
  49. const formattedMessage = Logger._FormatMessage(msg);
  50. const type = this._Levels[level];
  51. const optionals = Array.isArray(message) ? message.slice(1) : [];
  52. type.logFunc && type.logFunc("BJS - " + formattedMessage, ...optionals);
  53. const entry = `<div style='color:${type.color}'>${formattedMessage}</div><br>`;
  54. Logger._AddLogEntry(entry);
  55. Logger._GenerateLimitMessage(msg, level);
  56. }
  57. /**
  58. * Gets current log cache (list of logs)
  59. */
  60. static get LogCache() {
  61. return Logger._LogCache;
  62. }
  63. /**
  64. * Clears the log cache
  65. */
  66. static ClearLogCache() {
  67. Logger._LogCache = "";
  68. Logger._LogLimitOutputs = {};
  69. Logger.errorsCount = 0;
  70. }
  71. /**
  72. * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel)
  73. */
  74. static set LogLevels(level) {
  75. Logger.Log = Logger._LogDisabled;
  76. Logger.Warn = Logger._LogDisabled;
  77. Logger.Error = Logger._LogDisabled;
  78. [Logger.MessageLogLevel, Logger.WarningLogLevel, Logger.ErrorLogLevel].forEach((l) => {
  79. if ((level & l) === l) {
  80. const type = this._Levels[l];
  81. Logger[type.name] = Logger._LogEnabled.bind(Logger, l);
  82. }
  83. });
  84. }
  85. }
  86. /**
  87. * No log
  88. */
  89. Logger.NoneLogLevel = 0;
  90. /**
  91. * Only message logs
  92. */
  93. Logger.MessageLogLevel = 1;
  94. /**
  95. * Only warning logs
  96. */
  97. Logger.WarningLogLevel = 2;
  98. /**
  99. * Only error logs
  100. */
  101. Logger.ErrorLogLevel = 4;
  102. /**
  103. * All logs
  104. */
  105. Logger.AllLogLevel = 7;
  106. /**
  107. * Message to display when a message has been logged too many times
  108. */
  109. Logger.MessageLimitReached = "Too many %TYPE%s (%LIMIT%), no more %TYPE%s will be reported for this message.";
  110. Logger._LogCache = "";
  111. Logger._LogLimitOutputs = {};
  112. // levels according to the (binary) numbering.
  113. Logger._Levels = [
  114. {},
  115. { color: "white", logFunc: console.log, name: "Log" },
  116. { color: "orange", logFunc: console.warn, name: "Warn" },
  117. {},
  118. { color: "red", logFunc: console.error, name: "Error" },
  119. ];
  120. /**
  121. * Gets a value indicating the number of loading errors
  122. * @ignorenaming
  123. */
  124. // eslint-disable-next-line @typescript-eslint/naming-convention
  125. Logger.errorsCount = 0;
  126. /**
  127. * Log a message to the console
  128. */
  129. Logger.Log = Logger._LogEnabled.bind(Logger, Logger.MessageLogLevel);
  130. /**
  131. * Write a warning message to the console
  132. */
  133. Logger.Warn = Logger._LogEnabled.bind(Logger, Logger.WarningLogLevel);
  134. /**
  135. * Write an error message to the console
  136. */
  137. Logger.Error = Logger._LogEnabled.bind(Logger, Logger.ErrorLogLevel);
  138. //# sourceMappingURL=logger.js.map