refactor(logging): use Timber instead of Kermit

Android-only project, so Timber (the de-facto Android logging lib) fits better than the
KMP-oriented Kermit.

- Catalog: kermit -> timber (com.jakewharton.timber:timber 5.0.1).
- core:data: Ktor Logging bridged to Timber; safeCall logs via Timber.
- app: plant Timber.DebugTree() in debug only (buildConfig enabled for BuildConfig.DEBUG).
This commit is contained in:
2026-06-10 12:23:43 +02:00
parent b7ccf2fefa
commit 6a1842ae96
6 changed files with 28 additions and 11 deletions

View File

@@ -18,5 +18,5 @@ android {
dependencies {
implementation(project(":core:domain"))
implementation(libs.kermit)
implementation(libs.timber)
}

View File

@@ -13,10 +13,10 @@ import io.ktor.client.request.setBody
import io.ktor.client.request.url
import io.ktor.client.statement.HttpResponse
import kotlinx.serialization.SerializationException
import timber.log.Timber
import java.net.UnknownHostException
import java.nio.channels.UnresolvedAddressException
import kotlin.coroutines.cancellation.CancellationException
import co.touchlab.kermit.Logger as KermitLogger
suspend inline fun <reified Response : Any> HttpClient.get(
route: String,
@@ -65,17 +65,17 @@ suspend inline fun <reified T> safeCall(
return try {
responseToResult(execute())
} catch (e: UnresolvedAddressException) {
KermitLogger.withTag("HttpClient").e(e) { "No internet (unresolved address)" }
Timber.tag("HttpClient").e(e, "No internet (unresolved address)")
Result.Error(DataError.Network.NO_INTERNET)
} catch (e: UnknownHostException) {
KermitLogger.withTag("HttpClient").e(e) { "No internet (unknown host)" }
Timber.tag("HttpClient").e(e, "No internet (unknown host)")
Result.Error(DataError.Network.NO_INTERNET)
} catch (e: SerializationException) {
KermitLogger.withTag("HttpClient").e(e) { "Serialization failure" }
Timber.tag("HttpClient").e(e, "Serialization failure")
Result.Error(DataError.Network.SERIALIZATION)
} catch (e: Exception) {
if (e is CancellationException) throw e
KermitLogger.withTag("HttpClient").e(e) { "Unknown network failure" }
Timber.tag("HttpClient").e(e, "Unknown network failure")
Result.Error(DataError.Network.UNKNOWN)
}
}

View File

@@ -10,12 +10,13 @@ import io.ktor.http.ContentType
import io.ktor.http.contentType
import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.json.Json
import co.touchlab.kermit.Logger as KermitLogger
import timber.log.Timber
import io.ktor.client.plugins.logging.Logger as KtorLogger
/**
* Builds the app's single [HttpClient]. The [engine] is injected so tests can pass a Ktor
* `MockEngine` while production passes OkHttp (see `coreDataModule`).
* `MockEngine` while production passes OkHttp (see `coreDataModule`). Ktor logging is bridged to
* Timber so all logs flow through one tree (planted in the Application).
*/
object HttpClientFactory {
fun create(engine: HttpClientEngine): HttpClient {
@@ -30,7 +31,7 @@ object HttpClientFactory {
install(Logging) {
logger = object : KtorLogger {
override fun log(message: String) {
KermitLogger.withTag("HttpClient").d(message)
Timber.tag("HttpClient").d(message)
}
}
level = LogLevel.ALL