diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 6259ce7..86cf895 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -55,6 +55,8 @@ kotlin { implementation(libs.koin.core) implementation(libs.koin.compose.viewmodel) + + implementation(libs.logger.napier) } iosMain.dependencies { implementation(libs.ktor.client.darwin) diff --git a/composeApp/src/androidMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/MyApplication.kt b/composeApp/src/androidMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/MyApplication.kt index 2a54caa..67eaa6b 100644 --- a/composeApp/src/androidMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/MyApplication.kt +++ b/composeApp/src/androidMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/MyApplication.kt @@ -2,10 +2,14 @@ package com.digitoolsolutions.app.torquevaultkmp import android.app.Application import com.digitoolsolutions.app.torquevaultkmp.di.initKoin +import io.github.aakira.napier.DebugAntilog +import io.github.aakira.napier.Napier import org.koin.android.ext.koin.androidContext class MyApplication : Application() { override fun onCreate() { super.onCreate() + // Add logger lib + Napier.base(DebugAntilog()) // NoOpAntilog() for release initKoin { androidContext(this@MyApplication) } diff --git a/composeApp/src/androidMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/NetworkEngine.android.kt b/composeApp/src/androidMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/NetworkEngine.android.kt index 226de3c..80fc1cc 100644 --- a/composeApp/src/androidMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/NetworkEngine.android.kt +++ b/composeApp/src/androidMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/NetworkEngine.android.kt @@ -11,6 +11,9 @@ import io.ktor.client.plugins.DefaultRequest import io.ktor.client.plugins.HttpSend import io.ktor.client.plugins.HttpTimeout import io.ktor.client.plugins.contentnegotiation.ContentNegotiation +import io.ktor.client.plugins.logging.LogLevel +import io.ktor.client.plugins.logging.Logger +import io.ktor.client.plugins.logging.Logging import io.ktor.client.plugins.plugin import io.ktor.client.request.header import io.ktor.http.HttpStatusCode @@ -34,6 +37,14 @@ actual fun createPlatformHttpClient( } } install(HttpTimeout) { requestTimeoutMillis = 30_000 } + install(Logging) { + logger = object : Logger { + override fun log(message: String) { + Napier.v(message, tag = "HTTP") + } + } + level = LogLevel.ALL // set LogLevel.NONE for release + } } if (authApi != null) { diff --git a/composeApp/src/commonMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/data/network/api/AuthApi.kt b/composeApp/src/commonMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/data/network/api/AuthApi.kt index 3c651e4..a0e6b19 100644 --- a/composeApp/src/commonMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/data/network/api/AuthApi.kt +++ b/composeApp/src/commonMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/data/network/api/AuthApi.kt @@ -20,16 +20,14 @@ class AuthApi( ) { suspend fun login(username: String, password: String): Boolean { return try { - println(">>>>> Check LOGIN Api") val res: LoginResponseDto = client.post("$baseUrl${Endpoints.AUTH_TOKEN}") { contentType(ContentType.Application.Json) setBody(LoginRequestDto(username, password)) }.body() - println(res) tokenManager.saveTokens(res.access, res.refresh) true } catch (e: Exception) { - println(">>>>> [AuthApi] Exception: $e") + println(">>>>> [AuthApi.kt] Exception: $e") false } } diff --git a/composeApp/src/commonMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/utils/NoOpAntilog.kt b/composeApp/src/commonMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/utils/NoOpAntilog.kt new file mode 100644 index 0000000..5ecb272 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/utils/NoOpAntilog.kt @@ -0,0 +1,9 @@ +package com.digitoolsolutions.app.torquevaultkmp.utils + +import io.github.aakira.napier.Antilog +import io.github.aakira.napier.LogLevel + +class NoOpAntilog : Antilog() { + override fun isEnable(priority: LogLevel, tag: String?): Boolean = false + override fun performLog(priority: LogLevel, tag: String?, throwable: Throwable?, message: String?) {} +} \ No newline at end of file diff --git a/composeApp/src/iosMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/MainViewController.kt b/composeApp/src/iosMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/MainViewController.kt index f15e3f6..86e90fe 100644 --- a/composeApp/src/iosMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/MainViewController.kt +++ b/composeApp/src/iosMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/MainViewController.kt @@ -2,9 +2,13 @@ package com.digitoolsolutions.app.torquevaultkmp import androidx.compose.ui.window.ComposeUIViewController import com.digitoolsolutions.app.torquevaultkmp.di.initKoin +import io.github.aakira.napier.DebugAntilog +import io.github.aakira.napier.Napier fun MainViewController() = ComposeUIViewController( configure = { + // Add logger lib + Napier.base(DebugAntilog()) // NoOpAntilog() for release initKoin() } ) { App() } \ No newline at end of file diff --git a/composeApp/src/iosMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/NetworkEngine.ios.kt b/composeApp/src/iosMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/NetworkEngine.ios.kt index a3d2816..e35f86d 100644 --- a/composeApp/src/iosMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/NetworkEngine.ios.kt +++ b/composeApp/src/iosMain/kotlin/com/digitoolsolutions/app/torquevaultkmp/NetworkEngine.ios.kt @@ -4,12 +4,16 @@ import com.digitoolsolutions.app.torquevaultkmp.data.network.api.AuthApi import com.digitoolsolutions.app.torquevaultkmp.data.storage.ReferKeys import com.digitoolsolutions.app.torquevaultkmp.data.storage.TokenManager import com.digitoolsolutions.app.torquevaultkmp.utils.ForceLogoutException +import io.github.aakira.napier.Napier import io.ktor.client.HttpClient import io.ktor.client.engine.darwin.Darwin import io.ktor.client.plugins.DefaultRequest import io.ktor.client.plugins.HttpSend import io.ktor.client.plugins.HttpTimeout import io.ktor.client.plugins.contentnegotiation.ContentNegotiation +import io.ktor.client.plugins.logging.LogLevel +import io.ktor.client.plugins.logging.Logger +import io.ktor.client.plugins.logging.Logging import io.ktor.client.plugins.plugin import io.ktor.client.request.header import io.ktor.http.HttpStatusCode @@ -33,6 +37,14 @@ actual fun createPlatformHttpClient( } } install(HttpTimeout) { requestTimeoutMillis = 30_000 } + install(Logging) { + logger = object : Logger { + override fun log(message: String) { + Napier.v(message, tag = "HTTP") + } + } + level = LogLevel.ALL // set LogLevel.NONE for release + } } if (authApi != null) { @@ -44,7 +56,7 @@ actual fun createPlatformHttpClient( val originalCall = execute(request) if (originalCall.response.status == HttpStatusCode.Unauthorized) { - println(">>>>> [NetworkEngine.ios.kt] Access token expired, auto request refresh token...") + Napier.d(">>>>> [NetworkEngine.ios.kt] Access token expired, auto request refresh token...") val newToken = authApi.refreshToken() if (newToken != null) { request.headers["Authorization"] = "Bearer $newToken" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 258e333..d371550 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,6 +17,7 @@ koin-bom = "4.2.1" ktor = "3.4.3" material-icons-extended = "1.7.3" navigation-compose = "2.9.2" +logger = "2.7.1" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } @@ -54,6 +55,7 @@ ktor-client-darwin = { module = "io.ktor:ktor-client-darwin", version.ref = "kto ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" } ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" } ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" } +logger-napier = { module = "io.github.aakira:napier", version.ref = "logger" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" }