package nl.astraeus.persistence enum class LogLevel { TRACE, DEBUG, INFO, WARN, ERROR } object Logger { var level: LogLevel = LogLevel.DEBUG var tracePrinter: (String) -> Unit = { println(it) } var debugPrinter: (String) -> Unit = { println(it) } var infoPrinter: (String) -> Unit = { println(it) } var warnPrinter: (String) -> Unit = { println(it) } var errorPrinter: (String) -> Unit = { System.err.println(it) } fun trace(message: String, vararg parameters: Any?) { if (level <= LogLevel.TRACE) { writeLogMessage(LogLevel.TRACE, message, *parameters) } } fun debug(message: String, vararg parameters: Any?) { if (level <= LogLevel.DEBUG) { writeLogMessage(LogLevel.DEBUG, message, *parameters) } } fun info(message: String, vararg parameters: Any?) { if (level <= LogLevel.INFO) { writeLogMessage(LogLevel.INFO, message, *parameters) } } fun warn(message: String, vararg parameters: Any?) { if (level <= LogLevel.DEBUG) { writeLogMessage(LogLevel.DEBUG, message, *parameters) } } fun error(message: String, vararg parameters: Any?) { if (level <= LogLevel.ERROR) { writeLogMessage(LogLevel.ERROR, message, *parameters) } } private fun writeLogMessage(level: LogLevel, message: String, vararg parameters: Any?) { val formattedMessage = "[${level}] - ${message.format(*parameters)}" when (level) { LogLevel.TRACE -> tracePrinter(formattedMessage) LogLevel.DEBUG -> debugPrinter(formattedMessage) LogLevel.INFO -> infoPrinter(formattedMessage) LogLevel.WARN -> warnPrinter(formattedMessage) LogLevel.ERROR -> errorPrinter(formattedMessage) } } }