diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml
index fa16dad496..afa7d8a963 100644
--- a/core-kotlin/pom.xml
+++ b/core-kotlin/pom.xml
@@ -60,7 +60,6 @@
org.jetbrains.kotlin
kotlin-reflect
${kotlin-reflect.version}
- test
org.jetbrains.kotlinx
@@ -224,10 +223,11 @@
- 1.2.41
- 1.2.41
- 1.2.41
- 1.2.41
+ UTF-8
+ 1.2.51
+ 1.2.51
+ 1.2.51
+ 1.2.51
0.22.5
0.9.2
1.5.0
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsExtensionOnAny.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsExtensionOnAny.kt
new file mode 100644
index 0000000000..32d968fff5
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsExtensionOnAny.kt
@@ -0,0 +1,30 @@
+package com.baeldung.kotlin.logging
+
+import org.slf4j.Logger
+
+open class LoggerAsExtensionOnAny {
+ val logger = logger()
+
+ fun log(s: String) {
+ logger().info(s)
+ logger.info(s)
+ }
+}
+
+class ExtensionSubclass : LoggerAsExtensionOnAny()
+
+fun T.logger(): Logger = getLogger(getClassForLogging(javaClass))
+
+fun main(args: Array) {
+ LoggerAsExtensionOnAny().log("test")
+ ExtensionSubclass().log("sub")
+ "foo".logger().info("foo")
+ 1.logger().info("uh-oh!")
+ SomeOtherClass().logger()
+}
+
+class SomeOtherClass {
+ fun logger(): String {
+ return "foo"
+ }
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsExtensionOnMarkerInterface.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsExtensionOnMarkerInterface.kt
new file mode 100644
index 0000000000..b33d4c9f93
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsExtensionOnMarkerInterface.kt
@@ -0,0 +1,30 @@
+package com.baeldung.kotlin.logging
+
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+interface Logging
+
+inline fun T.logger(): Logger =
+ //Wrong logger name!
+ //LoggerFactory.getLogger(javaClass.name + " w/interface")
+ LoggerFactory.getLogger(getClassForLogging(T::class.java).name + " w/interface")
+
+open class LoggerAsExtensionOnMarkerInterface : Logging {
+ companion object : Logging {
+ val logger = logger()
+ }
+
+ fun log(s: String) {
+ logger().info(s)
+ logger.info(s)
+ }
+}
+
+class MarkerExtensionSubclass : LoggerAsExtensionOnMarkerInterface()
+
+fun main(args: Array) {
+ LoggerAsExtensionOnMarkerInterface().log("test")
+ MarkerExtensionSubclass().log("sub")
+ "foo".logger().info("foo")
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsProperty.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsProperty.kt
new file mode 100644
index 0000000000..979b3b3a10
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsProperty.kt
@@ -0,0 +1,17 @@
+package com.baeldung.kotlin.logging
+
+open class LoggerAsProperty {
+ private val logger = getLogger(javaClass)
+
+ fun log(s: String) {
+ logger.info(s)
+ }
+
+}
+
+class PropertySubclass : LoggerAsProperty()
+
+fun main(args: Array) {
+ LoggerAsProperty().log("test")
+ PropertySubclass().log("sub")
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsPropertyDelegate.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsPropertyDelegate.kt
new file mode 100644
index 0000000000..23f04722be
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerAsPropertyDelegate.kt
@@ -0,0 +1,47 @@
+package com.baeldung.kotlin.logging
+
+import org.slf4j.Logger
+import kotlin.properties.ReadOnlyProperty
+import kotlin.reflect.KProperty
+
+open class LoggerAsPropertyDelegate {
+ private val lazyLogger by lazyLogger()
+ protected val logger by LoggerDelegate()
+ private val logger2 = logger
+
+ companion object {
+ private val lazyLoggerComp by lazyLogger()
+ private val loggerComp by LoggerDelegate()
+ }
+
+ open fun log(s: String) {
+ logger.info(s)
+ logger2.info(s)
+ lazyLogger.info(s)
+ loggerComp.info(s)
+ lazyLoggerComp.info(s)
+ }
+
+}
+
+class DelegateSubclass : LoggerAsPropertyDelegate() {
+ override fun log(s: String) {
+ logger.info("-- in sub")
+ super.log(s)
+ }
+}
+
+fun lazyLogger(forClass: Class<*>): Lazy =
+ lazy { getLogger(getClassForLogging(forClass)) }
+
+fun T.lazyLogger(): Lazy = lazyLogger(javaClass)
+
+fun main(args: Array) {
+ LoggerAsPropertyDelegate().log("test")
+ DelegateSubclass().log("sub")
+}
+
+class LoggerDelegate : ReadOnlyProperty {
+ override fun getValue(thisRef: R, property: KProperty<*>) =
+ getLogger(getClassForLogging(thisRef.javaClass))
+}
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerInCompanionObject.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerInCompanionObject.kt
new file mode 100644
index 0000000000..f973606369
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/LoggerInCompanionObject.kt
@@ -0,0 +1,44 @@
+package com.baeldung.kotlin.logging
+
+open class LoggerInCompanionObject {
+ companion object {
+ private val loggerWithExplicitClass = getLogger(LoggerInCompanionObject::class.java)
+ @Suppress("JAVA_CLASS_ON_COMPANION")
+ private val loggerWithWrongClass = getLogger(javaClass)
+ @Suppress("JAVA_CLASS_ON_COMPANION")
+ private val logger = getLogger(javaClass.enclosingClass)
+ }
+
+ fun log(s: String) {
+ loggerWithExplicitClass.info(s)
+ loggerWithWrongClass.info(s)
+ logger.info(s)
+ }
+
+ class Inner {
+ companion object {
+ private val loggerWithExplicitClass = getLogger(Inner::class.java)
+ @Suppress("JAVA_CLASS_ON_COMPANION")
+ @JvmStatic
+ private val loggerWithWrongClass = getLogger(javaClass)
+ @Suppress("JAVA_CLASS_ON_COMPANION")
+ @JvmStatic
+ private val logger = getLogger(javaClass.enclosingClass)
+ }
+
+ fun log(s: String) {
+ loggerWithExplicitClass.info(s)
+ loggerWithWrongClass.info(s)
+ logger.info(s)
+ }
+ }
+
+}
+
+class CompanionSubclass : LoggerInCompanionObject()
+
+fun main(args: Array) {
+ LoggerInCompanionObject().log("test")
+ LoggerInCompanionObject.Inner().log("test")
+ CompanionSubclass().log("sub")
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/Util.kt b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/Util.kt
new file mode 100644
index 0000000000..b9c0d9e34c
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/kotlin/logging/Util.kt
@@ -0,0 +1,13 @@
+package com.baeldung.kotlin.logging
+
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import kotlin.reflect.full.companionObject
+
+fun getLogger(forClass: Class<*>): Logger = LoggerFactory.getLogger(forClass)
+
+fun getClassForLogging(javaClass: Class): Class<*> {
+ return javaClass.enclosingClass?.takeIf {
+ it.kotlin.companionObject?.java == javaClass
+ } ?: javaClass
+}
\ No newline at end of file