Add Napier logger library

This commit is contained in:
2026-05-15 00:22:41 +07:00
parent 04bb4bf1cd
commit 99ebe57871
8 changed files with 46 additions and 4 deletions
+2
View File
@@ -55,6 +55,8 @@ kotlin {
implementation(libs.koin.core) implementation(libs.koin.core)
implementation(libs.koin.compose.viewmodel) implementation(libs.koin.compose.viewmodel)
implementation(libs.logger.napier)
} }
iosMain.dependencies { iosMain.dependencies {
implementation(libs.ktor.client.darwin) implementation(libs.ktor.client.darwin)
@@ -2,10 +2,14 @@ package com.digitoolsolutions.app.torquevaultkmp
import android.app.Application import android.app.Application
import com.digitoolsolutions.app.torquevaultkmp.di.initKoin 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 import org.koin.android.ext.koin.androidContext
class MyApplication : Application() { class MyApplication : Application() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
// Add logger lib
Napier.base(DebugAntilog()) // NoOpAntilog() for release
initKoin { initKoin {
androidContext(this@MyApplication) androidContext(this@MyApplication)
} }
@@ -11,6 +11,9 @@ import io.ktor.client.plugins.DefaultRequest
import io.ktor.client.plugins.HttpSend import io.ktor.client.plugins.HttpSend
import io.ktor.client.plugins.HttpTimeout import io.ktor.client.plugins.HttpTimeout
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation 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.plugins.plugin
import io.ktor.client.request.header import io.ktor.client.request.header
import io.ktor.http.HttpStatusCode import io.ktor.http.HttpStatusCode
@@ -34,6 +37,14 @@ actual fun createPlatformHttpClient(
} }
} }
install(HttpTimeout) { requestTimeoutMillis = 30_000 } 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) { if (authApi != null) {
@@ -20,16 +20,14 @@ class AuthApi(
) { ) {
suspend fun login(username: String, password: String): Boolean { suspend fun login(username: String, password: String): Boolean {
return try { return try {
println(">>>>> Check LOGIN Api")
val res: LoginResponseDto = client.post("$baseUrl${Endpoints.AUTH_TOKEN}") { val res: LoginResponseDto = client.post("$baseUrl${Endpoints.AUTH_TOKEN}") {
contentType(ContentType.Application.Json) contentType(ContentType.Application.Json)
setBody(LoginRequestDto(username, password)) setBody(LoginRequestDto(username, password))
}.body() }.body()
println(res)
tokenManager.saveTokens(res.access, res.refresh) tokenManager.saveTokens(res.access, res.refresh)
true true
} catch (e: Exception) { } catch (e: Exception) {
println(">>>>> [AuthApi] Exception: $e") println(">>>>> [AuthApi.kt] Exception: $e")
false false
} }
} }
@@ -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?) {}
}
@@ -2,9 +2,13 @@ package com.digitoolsolutions.app.torquevaultkmp
import androidx.compose.ui.window.ComposeUIViewController import androidx.compose.ui.window.ComposeUIViewController
import com.digitoolsolutions.app.torquevaultkmp.di.initKoin import com.digitoolsolutions.app.torquevaultkmp.di.initKoin
import io.github.aakira.napier.DebugAntilog
import io.github.aakira.napier.Napier
fun MainViewController() = ComposeUIViewController( fun MainViewController() = ComposeUIViewController(
configure = { configure = {
// Add logger lib
Napier.base(DebugAntilog()) // NoOpAntilog() for release
initKoin() initKoin()
} }
) { App() } ) { App() }
@@ -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.ReferKeys
import com.digitoolsolutions.app.torquevaultkmp.data.storage.TokenManager import com.digitoolsolutions.app.torquevaultkmp.data.storage.TokenManager
import com.digitoolsolutions.app.torquevaultkmp.utils.ForceLogoutException import com.digitoolsolutions.app.torquevaultkmp.utils.ForceLogoutException
import io.github.aakira.napier.Napier
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.engine.darwin.Darwin import io.ktor.client.engine.darwin.Darwin
import io.ktor.client.plugins.DefaultRequest import io.ktor.client.plugins.DefaultRequest
import io.ktor.client.plugins.HttpSend import io.ktor.client.plugins.HttpSend
import io.ktor.client.plugins.HttpTimeout import io.ktor.client.plugins.HttpTimeout
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation 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.plugins.plugin
import io.ktor.client.request.header import io.ktor.client.request.header
import io.ktor.http.HttpStatusCode import io.ktor.http.HttpStatusCode
@@ -33,6 +37,14 @@ actual fun createPlatformHttpClient(
} }
} }
install(HttpTimeout) { requestTimeoutMillis = 30_000 } 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) { if (authApi != null) {
@@ -44,7 +56,7 @@ actual fun createPlatformHttpClient(
val originalCall = execute(request) val originalCall = execute(request)
if (originalCall.response.status == HttpStatusCode.Unauthorized) { 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() val newToken = authApi.refreshToken()
if (newToken != null) { if (newToken != null) {
request.headers["Authorization"] = "Bearer $newToken" request.headers["Authorization"] = "Bearer $newToken"
+2
View File
@@ -17,6 +17,7 @@ koin-bom = "4.2.1"
ktor = "3.4.3" ktor = "3.4.3"
material-icons-extended = "1.7.3" material-icons-extended = "1.7.3"
navigation-compose = "2.9.2" navigation-compose = "2.9.2"
logger = "2.7.1"
[libraries] [libraries]
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } 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-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-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" } ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ktor" }
logger-napier = { module = "io.github.aakira:napier", version.ref = "logger" }
[plugins] [plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" } androidApplication = { id = "com.android.application", version.ref = "agp" }