logger.ts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /**
  2. * Logger used throughout the application to allow configuration of
  3. * the log level required for the messages.
  4. */
  5. export class Logger {
  6. /**
  7. * No log
  8. */
  9. public static readonly NoneLogLevel = 0;
  10. /**
  11. * Only message logs
  12. */
  13. public static readonly MessageLogLevel = 1;
  14. /**
  15. * Only warning logs
  16. */
  17. public static readonly WarningLogLevel = 2;
  18. /**
  19. * Only error logs
  20. */
  21. public static readonly ErrorLogLevel = 4;
  22. /**
  23. * All logs
  24. */
  25. public static readonly AllLogLevel = 7;
  26. /**
  27. * Message to display when a message has been logged too many times
  28. */
  29. public static MessageLimitReached = "Too many %TYPE%s (%LIMIT%), no more %TYPE%s will be reported for this message.";
  30. private static _LogCache = "";
  31. private static _LogLimitOutputs: { [message: string]: { limit: number, current: number } } = {};
  32. /**
  33. * Gets a value indicating the number of loading errors
  34. * @ignorenaming
  35. */
  36. public static errorsCount = 0;
  37. /**
  38. * Callback called when a new log is added
  39. */
  40. public static OnNewCacheEntry: (entry: string) => void;
  41. private static _CheckLimit(message: string, limit: number): boolean {
  42. let entry = Logger._LogLimitOutputs[message];
  43. if (!entry) {
  44. entry = { limit, current: 1 };
  45. Logger._LogLimitOutputs[message] = entry;
  46. } else {
  47. entry.current++;
  48. }
  49. return entry.current <= entry.limit;
  50. }
  51. private static _GenerateLimitMessage(message: string, messageType: number): void {
  52. let entry = Logger._LogLimitOutputs[message];
  53. if (!entry || !Logger.MessageLimitReached) {
  54. return;
  55. }
  56. if (entry.current === entry.limit) {
  57. switch (messageType) {
  58. case 0:
  59. Logger.Log(Logger.MessageLimitReached.replace(/%LIMIT%/g, "" + entry.limit).replace(/%TYPE%/g, "log"));
  60. break;
  61. case 1:
  62. Logger.Warn(Logger.MessageLimitReached.replace(/%LIMIT%/g, "" + entry.limit).replace(/%TYPE%/g, "warning"));
  63. break;
  64. case 2:
  65. Logger.Error(Logger.MessageLimitReached.replace(/%LIMIT%/g, "" + entry.limit).replace(/%TYPE%/g, "error"));
  66. break;
  67. }
  68. }
  69. }
  70. private static _AddLogEntry(entry: string) {
  71. Logger._LogCache = entry + Logger._LogCache;
  72. if (Logger.OnNewCacheEntry) {
  73. Logger.OnNewCacheEntry(entry);
  74. }
  75. }
  76. private static _FormatMessage(message: string): string {
  77. var padStr = (i: number) => (i < 10) ? "0" + i : "" + i;
  78. var date = new Date();
  79. return "[" + padStr(date.getHours()) + ":" + padStr(date.getMinutes()) + ":" + padStr(date.getSeconds()) + "]: " + message;
  80. }
  81. private static _LogDisabled(message: string, limit?: number): void {
  82. // nothing to do
  83. }
  84. private static _LogEnabled(message: string, limit?: number): void {
  85. if (limit !== undefined && !Logger._CheckLimit(message, limit)) {
  86. return;
  87. }
  88. var formattedMessage = Logger._FormatMessage(message);
  89. console.log("BJS - " + formattedMessage);
  90. var entry = "<div style='color:white'>" + formattedMessage + "</div><br>";
  91. Logger._AddLogEntry(entry);
  92. Logger._GenerateLimitMessage(message, 0);
  93. }
  94. private static _WarnDisabled(message: string, limit?: number): void {
  95. // nothing to do
  96. }
  97. private static _WarnEnabled(message: string, limit?: number): void {
  98. if (limit !== undefined && !Logger._CheckLimit(message, limit)) {
  99. return;
  100. }
  101. var formattedMessage = Logger._FormatMessage(message);
  102. console.warn("BJS - " + formattedMessage);
  103. var entry = "<div style='color:orange'>" + message + "</div><br>";
  104. Logger._AddLogEntry(entry);
  105. Logger._GenerateLimitMessage(message, 1);
  106. }
  107. private static _ErrorDisabled(message: string, limit?: number): void {
  108. // nothing to do
  109. }
  110. private static _ErrorEnabled(message: string, limit?: number): void {
  111. if (limit !== undefined && !Logger._CheckLimit(message, limit)) {
  112. return;
  113. }
  114. var formattedMessage = Logger._FormatMessage(message);
  115. Logger.errorsCount++;
  116. console.error("BJS - " + formattedMessage);
  117. var entry = "<div style='color:red'>" + formattedMessage + "</div><br>";
  118. Logger._AddLogEntry(entry);
  119. Logger._GenerateLimitMessage(message, 2);
  120. }
  121. /**
  122. * Log a message to the console
  123. */
  124. public static Log: (message: string, limit?: number) => void = Logger._LogEnabled;
  125. /**
  126. * Write a warning message to the console
  127. */
  128. public static Warn: (message: string, limit?: number) => void = Logger._WarnEnabled;
  129. /**
  130. * Write an error message to the console
  131. */
  132. public static Error: (message: string, limit?: number) => void = Logger._ErrorEnabled;
  133. /**
  134. * Gets current log cache (list of logs)
  135. */
  136. public static get LogCache(): string {
  137. return Logger._LogCache;
  138. }
  139. /**
  140. * Clears the log cache
  141. */
  142. public static ClearLogCache(): void {
  143. Logger._LogCache = "";
  144. Logger._LogLimitOutputs = {};
  145. Logger.errorsCount = 0;
  146. }
  147. /**
  148. * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel)
  149. */
  150. public static set LogLevels(level: number) {
  151. if ((level & Logger.MessageLogLevel) === Logger.MessageLogLevel) {
  152. Logger.Log = Logger._LogEnabled;
  153. }
  154. else {
  155. Logger.Log = Logger._LogDisabled;
  156. }
  157. if ((level & Logger.WarningLogLevel) === Logger.WarningLogLevel) {
  158. Logger.Warn = Logger._WarnEnabled;
  159. }
  160. else {
  161. Logger.Warn = Logger._WarnDisabled;
  162. }
  163. if ((level & Logger.ErrorLogLevel) === Logger.ErrorLogLevel) {
  164. Logger.Error = Logger._ErrorEnabled;
  165. }
  166. else {
  167. Logger.Error = Logger._ErrorDisabled;
  168. }
  169. }
  170. }