export enum LogSeverity { FATAL, ERROR, WARN, INFO, DEBUG, TRACE } export enum LogModule { PROCESS, USER, DATABASE } abstract class Logger { readonly module = { ...LogModule } abstract log(severity: LogSeverity, module: LogModule, message: string): void fatal(module: LogModule, message: string): void { this.log(LogSeverity.FATAL, module, message) } error(module: LogModule, message: string): void { this.log(LogSeverity.ERROR, module, message) } warn(module: LogModule, message: string): void { this.log(LogSeverity.WARN, module, message) } info(module: LogModule, message: string): void { this.log(LogSeverity.INFO, module, message) } debug(module: LogModule, message: string): void { this.log(LogSeverity.DEBUG, module, message) } trace(module: LogModule, message: string): void { this.log(LogSeverity.TRACE, module, message) } } function create_log_string(severity: LogSeverity, module: LogModule, message: string): string { return `${(new Date()).toISOString()} [${LogModule[module]}] [${LogSeverity[severity]}] ${message}` } class DebugLogger extends Logger { log(severity: LogSeverity, module: LogModule, message: string): void { console.log(create_log_string(severity, module, message)) } } const _logger: Logger = new DebugLogger() export default _logger