diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-04-10 15:19:30 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-04-11 10:30:37 +0200 |
| commit | 25f91aab3e05372f451953309e82d05cbc76124e (patch) | |
| tree | 5c6f11d0011390e931e4b3ff818f4efee0889cf7 /android/lib | |
| parent | 224ef1c3c43a211418197afe04c63b621da6d594 (diff) | |
| download | mullvadvpn-25f91aab3e05372f451953309e82d05cbc76124e.tar.xz mullvadvpn-25f91aab3e05372f451953309e82d05cbc76124e.zip | |
Add the ability to turn on trace logging for grpc
Diffstat (limited to 'android/lib')
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 + } |
