summaryrefslogtreecommitdiffhomepage
path: root/android/lib
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-04-10 15:19:30 +0200
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-04-11 10:30:37 +0200
commit25f91aab3e05372f451953309e82d05cbc76124e (patch)
tree5c6f11d0011390e931e4b3ff818f4efee0889cf7 /android/lib
parent224ef1c3c43a211418197afe04c63b621da6d594 (diff)
downloadmullvadvpn-25f91aab3e05372f451953309e82d05cbc76124e.tar.xz
mullvadvpn-25f91aab3e05372f451953309e82d05cbc76124e.zip
Add the ability to turn on trace logging for grpc
Diffstat (limited to 'android/lib')
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt14
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/util/AndroidLoggingHandler.kt57
2 files changed, 71 insertions, 0 deletions
diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt
index 5e0077d1f8..bac6e22277 100644
--- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt
+++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt
@@ -18,6 +18,8 @@ import io.grpc.StatusException
import io.grpc.android.UdsChannelBuilder
import java.io.File
import java.net.InetAddress
+import java.util.logging.Level
+import java.util.logging.Logger as JavaLogger
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
@@ -41,6 +43,7 @@ import mullvad_daemon.management_interface.ManagementInterface
import mullvad_daemon.management_interface.ManagementServiceGrpcKt
import net.mullvad.mullvadvpn.lib.daemon.grpc.mapper.fromDomain
import net.mullvad.mullvadvpn.lib.daemon.grpc.mapper.toDomain
+import net.mullvad.mullvadvpn.lib.daemon.grpc.util.AndroidLoggingHandler
import net.mullvad.mullvadvpn.lib.daemon.grpc.util.LogInterceptor
import net.mullvad.mullvadvpn.lib.daemon.grpc.util.connectivityFlow
import net.mullvad.mullvadvpn.lib.model.AccountData
@@ -204,6 +207,13 @@ class ManagementService(
val currentAccessMethod: Flow<ApiAccessMethodSetting> =
_mutableCurrentAccessMethod.filterNotNull()
+ init {
+ if (extensiveLogging && ENABLE_TRACE_LOGGING) {
+ AndroidLoggingHandler.reset(AndroidLoggingHandler())
+ JavaLogger.getLogger("io.grpc").level = Level.FINEST
+ }
+ }
+
fun start() {
// Just to ensure that connection is set up since the connection won't be setup without a
// call to the daemon
@@ -845,6 +855,10 @@ class ManagementService(
throw it
}
}
+
+ companion object {
+ const val ENABLE_TRACE_LOGGING = false
+ }
}
sealed interface GrpcConnectivityState {
diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/util/AndroidLoggingHandler.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/util/AndroidLoggingHandler.kt
new file mode 100644
index 0000000000..f1aa8f1b18
--- /dev/null
+++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/util/AndroidLoggingHandler.kt
@@ -0,0 +1,57 @@
+package net.mullvad.mullvadvpn.lib.daemon.grpc.util
+
+import co.touchlab.kermit.Logger
+import co.touchlab.kermit.Severity
+import java.util.logging.Handler
+import java.util.logging.Level
+import java.util.logging.LogManager
+import java.util.logging.LogRecord
+
+// Based on:
+// https://stackoverflow.com/questions/4561345/how-to-configure-java-util-logging-on-android
+
+/** Make JUL work on Android. */
+class AndroidLoggingHandler : Handler() {
+ override fun publish(record: LogRecord) {
+ if (!super.isLoggable(record)) return
+
+ val name = record.loggerName
+ val tag = name.take(MAX_TAG_LENGTH)
+
+ val severity = record.level.toSeverity()
+ Logger.log(
+ severity = severity,
+ tag = tag,
+ message = record.message,
+ throwable = record.thrown,
+ )
+ }
+
+ override fun flush() {
+ // Do nothing
+ }
+
+ override fun close() {
+ // No-op, not required since we have nothing to close
+ }
+
+ companion object {
+ const val MAX_TAG_LENGTH = 30
+
+ fun reset(rootHandler: Handler) {
+ val rootLogger = LogManager.getLogManager().getLogger("")
+ for (handler in rootLogger.handlers) {
+ rootLogger.removeHandler(handler)
+ }
+ rootLogger.addHandler(rootHandler)
+ }
+ }
+}
+
+private fun Level.toSeverity(): Severity =
+ when (this) {
+ Level.SEVERE -> Severity.Error
+ Level.WARNING -> Severity.Warn
+ Level.INFO -> Severity.Info
+ else -> Severity.Debug
+ }