From 024cb66d37a21ae1b29643b5bdca5f3796cb7973 Mon Sep 17 00:00:00 2001 From: Matthias Urhahn <darken@darken.eu> Date: Thu, 27 Aug 2020 09:30:51 +0200 Subject: [PATCH] Improve transaction logging (#1061) (Spawned by EXPOSUREAPP-2267) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add explicit tags to allow for type specific filtering and fix bad log statements. Move OkHttp web logging to VERBOSE (from INFO). Co-authored-by: Matthias Urhahn <matthias.urhahn@sap.com> Co-authored-by: Jakob Möller <jakob.moeller@sap.com> --- .../rki/coronawarnapp/http/ServiceFactory.kt | 9 ++- .../RetrieveDiagnosisKeysTransaction.kt | 14 ++-- .../transaction/RiskLevelTransaction.kt | 70 +++++++++++-------- .../coronawarnapp/transaction/Transaction.kt | 8 +-- 4 files changed, 58 insertions(+), 43 deletions(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/ServiceFactory.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/ServiceFactory.kt index ae9366bfd..9e383ff44 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/ServiceFactory.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/http/ServiceFactory.kt @@ -22,6 +22,7 @@ import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import retrofit2.converter.protobuf.ProtoConverterFactory +import timber.log.Timber import java.io.File import java.util.concurrent.TimeUnit @@ -43,8 +44,12 @@ class ServiceFactory { */ private val mInterceptors: List<Interceptor> = listOf( WebSecurityVerificationInterceptor(), - HttpLoggingInterceptor().also { - if (BuildConfig.DEBUG) it.setLevel(HttpLoggingInterceptor.Level.BODY) + HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger { + override fun log(message: String) { + Timber.tag("OkHttp").v(message) + } + }).apply { + if (BuildConfig.DEBUG) setLevel(HttpLoggingInterceptor.Level.BODY) }, RetryInterceptor(), HttpErrorParser() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RetrieveDiagnosisKeysTransaction.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RetrieveDiagnosisKeysTransaction.kt index 37f736283..a770f1ed1 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RetrieveDiagnosisKeysTransaction.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RetrieveDiagnosisKeysTransaction.kt @@ -143,7 +143,7 @@ object RetrieveDiagnosisKeysTransaction : Transaction() { * not check in before. */ if (!InternalExposureNotificationClient.asyncIsEnabled()) { - Timber.w("EN is not enabled, skipping RetrieveDiagnosisKeys") + Timber.tag(TAG).w("EN is not enabled, skipping RetrieveDiagnosisKeys") executeClose() return@lockAndExecuteUnique } @@ -173,7 +173,7 @@ object RetrieveDiagnosisKeysTransaction : Transaction() { ****************************************************/ executeAPISubmission(token, keyFiles, exposureConfiguration) } else { - Timber.w("no key files, skipping submission to internal API.") + Timber.tag(TAG).w("no key files, skipping submission to internal API.") } /**************************************************** * Fetch Date Update @@ -205,17 +205,17 @@ object RetrieveDiagnosisKeysTransaction : Transaction() { } private fun rollbackSetup() { - Timber.v("rollback $SETUP") + Timber.tag(TAG).v("rollback $SETUP") LocalData.lastTimeDiagnosisKeysFromServerFetch(lastFetchDateForRollback.get()) } private fun rollbackToken() { - Timber.v("rollback $TOKEN") + Timber.tag(TAG).v("rollback $TOKEN") LocalData.googleApiToken(googleAPITokenForRollback.get()) } private suspend fun rollbackFilesFromWebRequests() { - Timber.v("rollback $FILES_FROM_WEB_REQUESTS") + Timber.tag(TAG).v("rollback $FILES_FROM_WEB_REQUESTS") KeyCacheRepository.getDateRepository(CoronaWarnApplication.getAppContext()) .clear() } @@ -226,7 +226,7 @@ object RetrieveDiagnosisKeysTransaction : Transaction() { private suspend fun executeSetup() = executeState(SETUP) { lastFetchDateForRollback.set(LocalData.lastTimeDiagnosisKeysFromServerFetch()) val currentDate = Date(System.currentTimeMillis()) - Timber.d("using $currentDate as current date in Transaction.") + Timber.tag(TAG).d("using $currentDate as current date in Transaction.") currentDate } @@ -277,7 +277,7 @@ object RetrieveDiagnosisKeysTransaction : Transaction() { token ) } - Timber.d("Diagnosis Keys provided successfully, Token: $token") + Timber.tag(TAG).d("Diagnosis Keys provided successfully, Token: $token") } /** diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt index 7551fc672..8bd531250 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/RiskLevelTransaction.kt @@ -7,10 +7,9 @@ import de.rki.coronawarnapp.R import de.rki.coronawarnapp.exception.RiskLevelCalculationException import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient import de.rki.coronawarnapp.notification.NotificationHelper -import de.rki.coronawarnapp.risk.RiskLevelCalculation import de.rki.coronawarnapp.risk.DefaultRiskLevelCalculation -import de.rki.coronawarnapp.risk.RiskScoreAnalysis import de.rki.coronawarnapp.risk.DefaultRiskScoreAnalysis +import de.rki.coronawarnapp.risk.RiskLevel import de.rki.coronawarnapp.risk.RiskLevel.INCREASED_RISK import de.rki.coronawarnapp.risk.RiskLevel.LOW_LEVEL_RISK import de.rki.coronawarnapp.risk.RiskLevel.NO_CALCULATION_POSSIBLE_TRACING_OFF @@ -18,23 +17,24 @@ import de.rki.coronawarnapp.risk.RiskLevel.UNDETERMINED import de.rki.coronawarnapp.risk.RiskLevel.UNKNOWN_RISK_INITIAL import de.rki.coronawarnapp.risk.RiskLevel.UNKNOWN_RISK_OUTDATED_RESULTS import de.rki.coronawarnapp.risk.RiskLevel.UNKNOWN_RISK_OUTDATED_RESULTS_MANUAL -import de.rki.coronawarnapp.risk.RiskLevel +import de.rki.coronawarnapp.risk.RiskLevelCalculation +import de.rki.coronawarnapp.risk.RiskScoreAnalysis import de.rki.coronawarnapp.risk.TimeVariables import de.rki.coronawarnapp.server.protocols.ApplicationConfigurationOuterClass import de.rki.coronawarnapp.service.applicationconfiguration.ApplicationConfigurationService import de.rki.coronawarnapp.storage.LocalData import de.rki.coronawarnapp.storage.RiskLevelRepository +import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.CHECK_APP_CONNECTIVITY +import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.CHECK_INCREASED_RISK import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.CHECK_TRACING import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.CHECK_UNKNOWN_RISK_INITIAL_NO_KEYS +import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.CHECK_UNKNOWN_RISK_INITIAL_TRACING_DURATION import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.CHECK_UNKNOWN_RISK_OUTDATED -import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.CHECK_APP_CONNECTIVITY +import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.CLOSE import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.RETRIEVE_APPLICATION_CONFIG import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.RETRIEVE_EXPOSURE_SUMMARY -import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.CHECK_INCREASED_RISK -import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.CHECK_UNKNOWN_RISK_INITIAL_TRACING_DURATION -import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.UPDATE_RISK_LEVEL import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.RISK_CALCULATION_DATE_UPDATE -import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.CLOSE +import de.rki.coronawarnapp.transaction.RiskLevelTransaction.RiskLevelTransactionState.UPDATE_RISK_LEVEL import de.rki.coronawarnapp.util.ConnectivityHelper import de.rki.coronawarnapp.util.TimeAndDateExtensions.millisecondsToHours import kotlinx.coroutines.Dispatchers @@ -274,7 +274,7 @@ object RiskLevelTransaction : Transaction() { val isTracingEnabled = InternalExposureNotificationClient.asyncIsEnabled() if (!isTracingEnabled) return@executeState NO_CALCULATION_POSSIBLE_TRACING_OFF - Timber.v("$transactionId - TRACING_NOT_ACTIVE_RISK not applicable") + Timber.tag(TAG).v("$transactionId - TRACING_NOT_ACTIVE_RISK not applicable") return@executeState UNDETERMINED } @@ -287,10 +287,12 @@ object RiskLevelTransaction : Transaction() { // if there was no key retrieval before, we return no calculation state TimeVariables.getLastTimeDiagnosisKeysFromServerFetch() ?: return@executeState UNKNOWN_RISK_INITIAL.also { - Timber.v("$transactionId - no last time diagnosis keys from server fetch timestamp was found") + Timber.tag(TAG).v( + "$transactionId - no last time diagnosis keys from server fetch timestamp was found" + ) } - Timber.v("$transactionId - CHECK_UNKNOWN_RISK_INITIAL_NO_KEYS not applicable") + Timber.tag(TAG).v("$transactionId - CHECK_UNKNOWN_RISK_INITIAL_NO_KEYS not applicable") return@executeState UNDETERMINED } @@ -314,18 +316,22 @@ object RiskLevelTransaction : Transaction() { ) { if (ConnectivityHelper.autoModeEnabled(CoronaWarnApplication.getAppContext())) { return@executeState UNKNOWN_RISK_OUTDATED_RESULTS.also { - Timber.v("diagnosis keys outdated and active tracing time is above threshold") - Timber.v("manual mode not active (background jobs enabled)") + Timber.tag(TAG).v( + "diagnosis keys outdated and active tracing time is above threshold" + ) + Timber.tag(TAG).v("manual mode not active (background jobs enabled)") } } else { return@executeState UNKNOWN_RISK_OUTDATED_RESULTS_MANUAL.also { - Timber.v("diagnosis keys outdated and active tracing time is above threshold") - Timber.v("manual mode active (background jobs disabled)") + Timber.tag(TAG).v( + "diagnosis keys outdated and active tracing time is above threshold" + ) + Timber.tag(TAG).v("manual mode active (background jobs disabled)") } } } - Timber.v("$transactionId - CHECK_UNKNOWN_RISK_OUTDATED not applicable") + Timber.tag(TAG).v("$transactionId - CHECK_UNKNOWN_RISK_OUTDATED not applicable") return@executeState UNDETERMINED } @@ -358,7 +364,7 @@ object RiskLevelTransaction : Transaction() { executeState(RETRIEVE_APPLICATION_CONFIG) { return@executeState getApplicationConfiguration() .also { - Timber.v(TAG, "$transactionId - retrieved configuration from backend") + Timber.tag(TAG).v("$transactionId - retrieved configuration from backend") } } @@ -370,7 +376,9 @@ object RiskLevelTransaction : Transaction() { val exposureSummary = getNewExposureSummary() return@executeState exposureSummary.also { - Timber.v(TAG, "$transactionId - get the exposure summary for further calculation") + Timber.tag(TAG).v( + "$transactionId - get the exposure summary for further calculation" + ) } } @@ -400,7 +408,7 @@ object RiskLevelTransaction : Transaction() { ) } - public fun getRiskLevel( + fun getRiskLevel( riskLevelCalculation: RiskLevelCalculation, riskScoreAnalysis: RiskScoreAnalysis, attenuationParameters: ApplicationConfigurationOuterClass.AttenuationDuration, @@ -413,7 +421,7 @@ object RiskLevelTransaction : Transaction() { attenuationParameters, exposureSummary ).also { - Timber.v(TAG, "calculated risk with the given config: $it") + Timber.tag(TAG).v("calculated risk with the given config: $it") } // get the high risk score class @@ -428,7 +436,7 @@ object RiskLevelTransaction : Transaction() { highRiskScoreClass.max ) ) { - Timber.v("$riskScore is above the defined min value ${highRiskScoreClass.min}") + Timber.tag(TAG).v("$riskScore is above the defined min value ${highRiskScoreClass.min}") return INCREASED_RISK } else if (riskScore > highRiskScoreClass.max) { throw RiskLevelCalculationException( @@ -436,7 +444,7 @@ object RiskLevelTransaction : Transaction() { ) } - Timber.v("$transactionId - INCREASED_RISK not applicable") + Timber.tag(TAG).v("$transactionId - INCREASED_RISK not applicable") return UNDETERMINED } @@ -448,11 +456,11 @@ object RiskLevelTransaction : Transaction() { ) { // if the active tracing duration is not above the defined threshold we return no calculation state if (!isActiveTracingTimeAboveThreshold()) { - Timber.v("$transactionId - active tracing time is not enough") + Timber.tag(TAG).v("$transactionId - active tracing time is not enough") return@executeState UNKNOWN_RISK_INITIAL } - Timber.v("$transactionId - UNKNOWN_RISK_INITIAL not applicable") + Timber.tag(TAG).v("$transactionId - UNKNOWN_RISK_INITIAL not applicable") return@executeState UNDETERMINED } @@ -461,7 +469,7 @@ object RiskLevelTransaction : Transaction() { */ private suspend fun executeUpdateRiskLevelScore(riskLevel: RiskLevel) = executeState(UPDATE_RISK_LEVEL) { - Timber.v("$transactionId - update the risk level with $riskLevel") + Timber.tag(TAG).v("$transactionId - update the risk level with $riskLevel") updateRiskLevelScore(riskLevel) } @@ -469,7 +477,7 @@ object RiskLevelTransaction : Transaction() { * Executes the [CLOSE] Transaction State */ private suspend fun executeClose() = executeState(CLOSE) { - Timber.v("$transactionId - transaction will close") + Timber.tag(TAG).v("$transactionId - transaction will close") lastCalculatedRiskLevelScoreForRollback.set(null) lastCalculatedRiskLevelDate.set(null) } @@ -488,7 +496,9 @@ object RiskLevelTransaction : Transaction() { */ private suspend fun isValidResult(riskLevel: RiskLevel): Boolean { if (riskLevel != UNDETERMINED) { - Timber.v("$transactionId - $riskLevel was determined by the transaction. UPDATE and CLOSE will be called") + Timber.tag(TAG).d( + "$transactionId - $riskLevel was determined by the transaction. UPDATE and CLOSE will be called" + ) lastCalculatedRiskLevelScoreForRollback.set(RiskLevelRepository.getLastCalculatedScore()) executeUpdateRiskLevelScore(riskLevel) lastCalculatedRiskLevelDate.set(LocalData.lastTimeRiskLevelCalculation()) @@ -507,7 +517,7 @@ object RiskLevelTransaction : Transaction() { private suspend fun getApplicationConfiguration(): ApplicationConfigurationOuterClass.ApplicationConfiguration = withContext(Dispatchers.Default) { return@withContext ApplicationConfigurationService.asyncRetrieveApplicationConfiguration() - .also { Timber.v("configuration from backend: $it") } + .also { Timber.tag(TAG).d("configuration from backend: $it") } } /** @@ -523,7 +533,7 @@ object RiskLevelTransaction : Transaction() { val activeTracingDurationInHours = durationTracingIsActive.millisecondsToHours() return (activeTracingDurationInHours >= durationTracingIsActiveThreshold).also { - Timber.v( + Timber.tag(TAG).v( "active tracing time ($activeTracingDurationInHours h) is above threshold " + "($durationTracingIsActiveThreshold h): $it" ) @@ -560,7 +570,7 @@ object RiskLevelTransaction : Transaction() { InternalExposureNotificationClient.asyncGetExposureSummary(googleToken) return exposureSummary.also { - Timber.v("$transactionId - generated new exposure summary with $googleToken") + Timber.tag(TAG).v("$transactionId - generated new exposure summary with $googleToken") } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/Transaction.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/Transaction.kt index f43dfd36a..54e5d219f 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/Transaction.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/Transaction.kt @@ -91,7 +91,7 @@ abstract class Transaction { private fun setState(state: TransactionState) = currentTransactionState.set(state) .also { - Timber.d("$transactionId - STATE CHANGE: ${currentTransactionState.get()}") + Timber.tag(TAG).d("$transactionId - STATE CHANGE: ${currentTransactionState.get()}") } /** @@ -217,7 +217,7 @@ abstract class Transaction { if (unique && internalMutualExclusionLock.isLocked) { val runningString = "TRANSACTION WITH ID $transactionId ALREADY RUNNING " + "($currentTransactionState) AS UNIQUE, SKIPPING EXECUTION." - Timber.w(runningString) + Timber.tag(TAG).w(runningString) return } try { @@ -231,7 +231,7 @@ abstract class Transaction { val completedString = "TRANSACTION $transactionId COMPLETED (${System.currentTimeMillis()}) " + "in $it ms, STATES EXECUTED: ${getExecutedStates()}" - Timber.i(completedString) + Timber.tag(TAG).i(completedString) } resetExecutedStateStack() } @@ -274,7 +274,7 @@ abstract class Transaction { * @throws RollbackException throws a rollback exception when handleRollbackError() is called */ protected open suspend fun rollback() { - if (BuildConfig.DEBUG) Timber.d("Initiate Rollback") + if (BuildConfig.DEBUG) Timber.tag(TAG).d("Initiate Rollback") } /** -- GitLab