KSLog/src/commonMain/kotlin/KSLog.kt

176 lines
5.4 KiB
Kotlin
Raw Normal View History

2022-06-07 15:42:19 +00:00
package dev.inmo.kslog.common
2022-07-30 08:56:26 +00:00
import dev.inmo.kslog.common.filter.filtered
2022-07-31 13:15:53 +00:00
import dev.inmo.kslog.common.utils.plus
2022-07-30 08:56:26 +00:00
2022-06-07 15:42:19 +00:00
enum class LogLevel {
2023-11-18 10:18:08 +00:00
TRACE,
2022-06-08 15:45:37 +00:00
DEBUG,
2022-06-07 15:42:19 +00:00
VERBOSE,
INFO,
WARNING,
ERROR,
ASSERT,
}
2023-11-18 11:15:23 +00:00
/**
* Base interface for any logger
*
* @see default
*
*/
2022-06-07 15:42:19 +00:00
interface KSLog {
2023-11-18 11:15:23 +00:00
/**
* The only one function required to realization in any inheritor. All other [performLog] functions
* will call this one by default
*/
fun performLog(level: LogLevel, tag: String?, message: Any, throwable: Throwable?)
2023-11-18 11:15:23 +00:00
/**
* Calls default [performLog] with `tag` == `null`
*/
fun performLog(level: LogLevel, message: Any, throwable: Throwable?) = performLog(level, null, message, throwable)
2023-11-18 11:15:23 +00:00
/**
* Calls default [performLog] with `message` built using [messageBuilder]. This method supposed to be overriden in
* case when logger supports lazy-loaded messages (like [dev.inmo.kslog.common.filter.FilterKSLog])
*/
2022-06-09 03:56:27 +00:00
fun performLog(
level: LogLevel,
tag: String?,
throwable: Throwable?,
messageBuilder: () -> Any
2022-06-09 03:56:27 +00:00
) = performLog(level, tag, messageBuilder(), throwable)
2023-11-18 11:15:23 +00:00
/**
* Suspendable variant of [performLog] with [messageBuilder]. Uses default [performLog] with `message` built using
* [messageBuilder] by default
*/
2022-06-09 10:29:56 +00:00
suspend fun performLogS(
2022-06-09 03:56:27 +00:00
level: LogLevel,
tag: String?,
throwable: Throwable?,
messageBuilder: suspend () -> Any
2022-06-09 03:56:27 +00:00
) = performLog(level, tag, messageBuilder(), throwable)
2022-06-07 15:42:19 +00:00
companion object : KSLog {
private var defaultLogger: KSLog? = null
/**
* Default logger used in case you are trying to use [KSLog] as a receiver for extensions like [info]
*/
2022-06-07 15:52:42 +00:00
var default: KSLog
2022-06-07 15:42:19 +00:00
get() {
return defaultLogger ?: KSLog("app").also {
defaultLogger = it
}
}
set(value) {
defaultLogger = value
}
override fun performLog(level: LogLevel, tag: String?, message: Any, throwable: Throwable?) = default.performLog(level, tag, message, throwable)
override fun performLog(level: LogLevel, message: Any, throwable: Throwable?) = default.performLog(level, message, throwable)
2022-06-09 10:29:56 +00:00
override fun performLog(
level: LogLevel,
tag: String?,
throwable: Throwable?,
messageBuilder: () -> Any
2022-06-09 10:29:56 +00:00
) = default.performLog(level, tag, throwable, messageBuilder)
override suspend fun performLogS(
level: LogLevel,
tag: String?,
throwable: Throwable?,
messageBuilder: suspend () -> Any
2022-06-09 10:29:56 +00:00
) = default.performLogS(level, tag, throwable, messageBuilder)
2022-06-07 15:42:19 +00:00
}
}
operator fun KSLog.invoke(performLogCallback: (level: LogLevel, tag: String?, message: Any, throwable: Throwable?) -> Unit) = CallbackKSLog(performLogCallback)
2022-06-07 15:42:19 +00:00
2022-09-12 09:44:59 +00:00
internal val printlnLogging: (level: LogLevel, tag: String, message: Any, throwable: Throwable?) -> Unit = { l, t, m, e ->
println(defaultMessageFormatter(l, t, m, e))
}
2022-06-09 10:29:56 +00:00
2023-11-18 11:15:23 +00:00
/**
* Simple builder for [DefaultKSLog] logger based on [defaultTag]
*/
2022-06-09 10:29:56 +00:00
fun KSLog(
2022-06-07 15:42:19 +00:00
defaultTag: String,
2023-04-13 04:33:13 +00:00
): KSLog = DefaultKSLog(defaultTag)
2023-04-12 16:42:17 +00:00
2023-11-18 11:15:23 +00:00
/**
* Simple builder for [DefaultKSLog] logger based on [defaultTag] and [messageFormatter]
*/
2023-04-12 16:42:17 +00:00
fun KSLog(
defaultTag: String,
messageFormatter: MessageFormatter
2022-07-30 08:56:26 +00:00
): KSLog = DefaultKSLog(
defaultTag,
messageFormatter
)
@Deprecated("Filtering should be replaced with FilterKSLog")
fun KSLog(
defaultTag: String,
filter: MessageFilter,
messageFormatter: MessageFormatter = defaultMessageFormatter
2023-04-12 16:42:17 +00:00
): KSLog = KSLog (
2022-06-09 10:29:56 +00:00
defaultTag,
messageFormatter
2023-04-12 16:42:17 +00:00
).filtered(filter)
2022-06-07 15:42:19 +00:00
2023-11-18 11:15:23 +00:00
/**
* Building logger using [KSLog] builder based on [defaultTag] and [messageFormatter]. This logger will also filter
* incoming levels: only levels passed in [levels] param will be logged
*/
2022-06-07 15:42:19 +00:00
fun KSLog(
defaultTag: String,
levels: Iterable<LogLevel>,
messageFormatter: MessageFormatter = defaultMessageFormatter
2022-06-08 10:06:41 +00:00
): KSLog {
2023-11-18 11:55:19 +00:00
val levelsSet = levels.toSet()
2022-07-30 08:56:26 +00:00
return KSLog (defaultTag, messageFormatter).filtered { l, _, _ ->
2023-11-18 11:55:19 +00:00
l in levelsSet
2022-07-30 08:56:26 +00:00
}
2022-06-07 15:42:19 +00:00
}
2022-06-07 16:00:32 +00:00
2023-11-18 11:15:23 +00:00
/**
* Building logger using [KSLog] builder based on [defaultTag] and [messageFormatter]. This logger will also filter
* incoming levels: only levels passed in [firstLevel], [secondLevel] and [otherLevels] param will be logged
*/
2022-06-08 12:23:11 +00:00
fun KSLog(
2022-06-08 10:10:34 +00:00
defaultTag: String,
firstLevel: LogLevel,
secondLevel: LogLevel,
vararg otherLevels: LogLevel,
messageFormatter: MessageFormatter = defaultMessageFormatter,
): KSLog = KSLog(defaultTag, setOf(firstLevel, secondLevel, *otherLevels), messageFormatter)
2022-06-08 10:10:34 +00:00
2023-11-18 11:15:23 +00:00
/**
* Building logger using [KSLog] builder based on [defaultTag] and [messageFormatter]. This logger will also filter
* incoming levels: only levels above [minLoggingLevel] will be logged
*/
2022-06-07 16:00:32 +00:00
fun KSLog(
defaultTag: String,
minLoggingLevel: LogLevel,
messageFormatter: MessageFormatter = defaultMessageFormatter,
): KSLog = KSLog (
defaultTag,
messageFormatter
2022-07-30 08:56:26 +00:00
).filtered { l, _, _ ->
minLoggingLevel.ordinal <= l.ordinal
}
2022-07-31 13:06:57 +00:00
2023-11-18 11:15:23 +00:00
/**
* Setting [KSLog.default] logger to [newDefault]
*/
2022-07-31 13:06:57 +00:00
fun setDefaultKSLog(newDefault: KSLog) { KSLog.default = newDefault }
2023-11-18 11:15:23 +00:00
/**
* Setting [KSLog.default] logger to new [CallbackKSLog] using [plus] operation
*/
fun addDefaultKSLog(newDefault: KSLog) {
KSLog.default += newDefault
}