Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ because it is fast, modern and has IDE integration (which warns you when you for
@Serializable annotations).
It also has multiplatform support, so we can use it in our KMP projects as well.

We use Napier because it's usage is close to Timber/Tolbaaken, but Napier supports KMM.
We use Kermit because it's usage is close to Timber/Tolbaaken, but Kermit supports KMM.

We use Crashlytics for crash reporting. Note that Google Analytics is not added. Google [recommends]
(https://firebase.google.com/docs/crashlytics/get-started?platform=android#before-you-begin)
Expand Down
6 changes: 0 additions & 6 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,3 @@
}

## END enums

## START napier
-keep class io.github.aakira.napier.** {
*;
}
## END napier
6 changes: 3 additions & 3 deletions app/src/main/kotlin/nl/q42/template/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import androidx.compose.ui.Modifier
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController
import io.github.aakira.napier.Napier
import co.touchlab.kermit.Logger
import nl.q42.template.core.utils.config.AppScheme
import nl.q42.template.navigation.Destination
import nl.q42.template.navigation.homeGraph
Expand All @@ -40,7 +40,7 @@ class MainActivity : ComponentActivity() {
enableEdgeToEdge() // must be called before super.onCreate
super.onCreate(savedInstanceState)

Napier.d { "onCreate received, ${intent.data}" }
Logger.d { "onCreate received, ${intent.data}" }

setContent {

Expand Down Expand Up @@ -77,7 +77,7 @@ class MainActivity : ComponentActivity() {
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)

Napier.d { "onNewIntent received, ${intent.data}" }
Logger.d { "onNewIntent received, ${intent.data}" }

}

Expand Down
20 changes: 15 additions & 5 deletions app/src/main/kotlin/nl/q42/template/MainApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,25 @@ package nl.q42.template

import android.app.Application
import android.os.StrictMode
import co.touchlab.kermit.LogcatWriter
import co.touchlab.kermit.Logger
import co.touchlab.kermit.Severity
import com.google.firebase.crashlytics.FirebaseCrashlytics
import io.github.aakira.napier.DebugAntilog
import io.github.aakira.napier.Napier
import nl.q42.template.di.initDependencyInjection
import nl.q42.template.logging.CrashlyticsLogger
import nl.q42.template.logging.CrashlyticsLogWriter

class MainApplication : Application() {

override fun onCreate() {
super.onCreate()

Logger.setTag("Template")

if (BuildConfig.DEBUG) {
FirebaseCrashlytics.getInstance().isCrashlyticsCollectionEnabled = false
Napier.base(DebugAntilog())

Logger.setMinSeverity(Severity.Verbose)
Logger.setLogWriters(LogcatWriter())

StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
Expand All @@ -27,7 +32,12 @@ class MainApplication : Application() {
)
} else {
FirebaseCrashlytics.getInstance().isCrashlyticsCollectionEnabled = true
Napier.base(CrashlyticsLogger())

Logger.setMinSeverity(Severity.Info)
Logger.setLogWriters(
LogcatWriter(),
CrashlyticsLogWriter()
)
}

initDependencyInjection(this)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package nl.q42.template.logging

import co.touchlab.kermit.LogWriter
import co.touchlab.kermit.Severity
import com.google.firebase.Firebase
import com.google.firebase.crashlytics.crashlytics

/** A value suitable for Crashlytics
* This value is used to truncate the user-defined message and the exception message
* In theory, the message sent to Crashlytics could therefore be 2x this value
*/
private const val MAX_CHARS_IN_LOG = 1200

/**
* A Crashlytics logger. Logs Severity.Error as Non-Fatal and less severe messages will be added
* to the next crashlytics event (crash, non-fatal or ANR) as breadcrumbs
*/
class CrashlyticsLogWriter : LogWriter() {
override fun log(
severity: Severity,
message: String,
tag: String,
throwable: Throwable?
) {

val limitedMessage =
message.take(MAX_CHARS_IN_LOG) // to avoid OutOfMemoryError's

if (severity < Severity.Error) {
val errorMessage = throwable?.let {
" with error: ${throwable}: ${throwable.message}".take(MAX_CHARS_IN_LOG)
} ?: ""
Firebase.crashlytics.log(limitedMessage + errorMessage)
} else {
Firebase.crashlytics.log("recordException with message: $limitedMessage")
Firebase.crashlytics.recordException(
throwable ?: Exception(
limitedMessage,
)
)
}
}

}
104 changes: 0 additions & 104 deletions app/src/main/kotlin/nl/q42/template/logging/CrashlyticsLogger.kt

This file was deleted.

2 changes: 1 addition & 1 deletion build.module.feature-and-app.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ android {

dependencies {
implementation project(':core:utils')
implementation(libs.napier)
implementation(libs.kermit)
implementation(libs.activityCompose)
implementation(libs.koin)

Expand Down
4 changes: 2 additions & 2 deletions build.module.library.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ android {
}

dependencies {
implementation(libs.napier)
}
implementation(libs.kermit)
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package nl.q42.template.actionresult.data

import co.touchlab.kermit.Logger
import com.haroldadmin.cnradapter.NetworkResponse
import io.github.aakira.napier.Napier
import kotlinx.coroutines.CancellationException
import kotlinx.serialization.SerializationException
import nl.q42.template.actionresult.domain.ActionResult
Expand Down Expand Up @@ -66,7 +66,7 @@ private fun <T : Any> NetworkResponse<T, ApiErrorResponse>.networkResponseToActi
val errorMessage = "Received NetworkResponse.UnknownError with response code $statusCode and header ${this.headers}"
val error = this.error
val exception = IOException(errorMessage, error)
Napier.w(error) { "NetworkResponse.UnknownError" }
Logger.w(error) { "NetworkResponse.UnknownError" }
when {
error is SerializationException -> { // (usually json) parsing error
ActionResult.Error.InvalidErrorResponse(error)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package nl.q42.template.core.network.logger

import io.github.aakira.napier.Napier
import co.touchlab.kermit.Logger
import okhttp3.logging.HttpLoggingInterceptor
import org.json.JSONException
import org.json.JSONObject
Expand All @@ -11,10 +11,10 @@ import org.json.JSONObject
class JsonFormattedHttpLogger : HttpLoggingInterceptor.Logger {
override fun log(message: String) {
if (message.startsWith("{") || message.startsWith("[")) try {
Napier.d { JSONObject(message).toString(4) }
Logger.d { JSONObject(message).toString(4) }
} catch (e: JSONException) {
Napier.d { message }
Logger.d { message }
}
else Napier.d { message }
else Logger.d { message }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,4 @@ private fun ColumnScreenContentPreview() {
}
},
)
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package nl.q42.template.data.main.remote

import io.github.aakira.napier.Napier
import co.touchlab.kermit.Logger
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import nl.q42.template.actionresult.data.mapToActionResult
Expand All @@ -25,7 +25,7 @@ internal class UserRemoteDataSource(
}

is ActionResult.Error -> {
Napier.e(apiActionResult.throwable) { "getUser failed" }
Logger.e(apiActionResult.throwable) { "getUser failed" }
apiActionResult
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package nl.q42.template.home.main.presentation

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import io.github.aakira.napier.Napier
import co.touchlab.kermit.Logger
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
Expand Down Expand Up @@ -48,11 +48,12 @@ class HomeViewModel(
}

fun onLoadClicked() {
Logger.i { "onLoadClicked" }
fetchUser()
}

fun onOpenSecondScreenClicked() {
Napier.e { "Open Second Screen tapped. This will be shown In LogCat and on prod builds also as as the title of a Non-Fatal event" }
Logger.e { "Open Second Screen tapped. This will be shown In LogCat and on prod builds also as as the title of a Non-Fatal event" }
navigateTo(Destination.HomeSecond(title = "Hello world!"))
}

Expand Down
4 changes: 2 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
[versions]
Comment thread
ninovanhooff marked this conversation as resolved.
jvmTarget = "21"
kermit = "2.0.8"
kotlin = "2.2.20"
# should match kotlin https://github.com/google/ksp/releases
gradlePlugin = "8.11.2"
Expand All @@ -10,7 +11,6 @@ retrofit = "3.0.0"
kotlinx-serialization = "1.9.0"
retrofit2KotlinxSerializationConverter = "1.0.0"
networkResponseAdapter = "5.0.0"
napier = "2.7.1"
composeNavigation = "2.9.5"
okhttp = "5.2.1"
composePlatform = "2025.10.00"
Expand All @@ -27,6 +27,7 @@ licensee = "1.14.1"

[libraries]
junit = { module = "junit:junit", version.ref = "junit" }
kermit = { module = "co.touchlab:kermit", version.ref = "kermit" }
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test" }
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinxCoroutinesTest" }
mockk-agent = { module = "io.mockk:mockk-agent", version.ref = "mockkAndroid" }
Expand All @@ -37,7 +38,6 @@ kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serializa
networkResponseAdapter = { module = "com.github.haroldadmin:NetworkResponseAdapter", version.ref = "networkResponseAdapter" }
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
okhttpLogging = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp" }
napier = { module = "io.github.aakira:napier", version.ref = "napier" }
composeUIGraphics = { module = "androidx.compose.ui:ui-graphics" }
composeUITooling = { module = "androidx.compose.ui:ui-tooling" }
composeUIToolingPreview = { module = "androidx.compose.ui:ui-tooling-preview" }
Expand Down