Make Enable Logging the master switch over all verbose logging

The verbose toggles (MPV, remote control) kept working with the master
"Enable Logging" toggle off: the settings UI hides them, but their
stored values - verboseMPVLogging is even iCloud-synced - were still
honored at runtime, producing console output and enabling the periodic
MPV stats collection while logging appeared disabled.

Enable Logging now takes precedence everywhere:

- LoggingService gates its DEBUG-build OSLog console output on the
  master toggle (it previously ran before the isEnabled guard, so the
  Xcode console was never silent)
- MPVLogging requires loggingEnabled && verboseMPVLogging, which also
  gates the 10s playback stats task via MPVLogging.verboseEnabled
- rcDebug in LocalNetworkService and RemoteControlCoordinator requires
  the master toggle alongside verboseRemoteControlLogging
This commit is contained in:
Arkadiusz Fal
2026-07-19 01:00:01 +02:00
parent 6aa5fd8ee7
commit 9c97036684
4 changed files with 27 additions and 15 deletions

View File

@@ -192,18 +192,23 @@ final class LoggingService: Sendable {
/// OSLog output is synchronous; in-app storage is dispatched to MainActor.
nonisolated func log(level: LogLevel, category: LogCategory, message: String, details: String? = nil) {
// Log to OSLog in DEBUG builds for Xcode console visibility
// OSLog/Logger is thread-safe, so this can be called from any thread
// OSLog/Logger is thread-safe, so this can be called from any thread.
// The master "Enable Logging" toggle gates this too - it takes
// precedence over everything, so logging off means a silent console.
// (Read UserDefaults directly: this runs off the MainActor.)
#if DEBUG
let fullMessage = details.map { "\(message) - \($0)" } ?? message
switch level {
case .debug:
osLogger.debug("[\(category.rawValue)] \(fullMessage)")
case .info:
osLogger.info("[\(category.rawValue)] \(fullMessage)")
case .warning:
osLogger.warning("[\(category.rawValue)] \(fullMessage)")
case .error:
osLogger.error("[\(category.rawValue)] \(fullMessage)")
if UserDefaults.standard.bool(forKey: "loggingEnabled") {
let fullMessage = details.map { "\(message) - \($0)" } ?? message
switch level {
case .debug:
osLogger.debug("[\(category.rawValue)] \(fullMessage)")
case .info:
osLogger.info("[\(category.rawValue)] \(fullMessage)")
case .warning:
osLogger.warning("[\(category.rawValue)] \(fullMessage)")
case .error:
osLogger.error("[\(category.rawValue)] \(fullMessage)")
}
}
#endif

View File

@@ -37,8 +37,11 @@ enum MPVLogging {
if now - _lastCheckTime > cacheDurationNanos {
_lastCheckTime = now
// Read from UserDefaults directly for thread safety
// (SettingsManager is @MainActor)
_cachedIsEnabled = UserDefaults.standard.bool(forKey: "verboseMPVLogging")
// (SettingsManager is @MainActor).
// The master "Enable Logging" switch takes precedence: with it off,
// verbose MPV logging is off no matter what the verbose flag says.
_cachedIsEnabled = UserDefaults.standard.bool(forKey: "loggingEnabled")
&& UserDefaults.standard.bool(forKey: "verboseMPVLogging")
}
return _cachedIsEnabled

View File

@@ -92,8 +92,10 @@ final class LocalNetworkService {
}
/// Log debug-level message. Only logs if verbose remote control logging is enabled.
/// The master "Enable Logging" toggle takes precedence over the verbose flag.
private func rcDebug(_ operation: String, _ message: String) {
guard UserDefaults.standard.bool(forKey: "verboseRemoteControlLogging") else { return }
guard UserDefaults.standard.bool(forKey: "loggingEnabled"),
UserDefaults.standard.bool(forKey: "verboseRemoteControlLogging") else { return }
let fullMessage = "[RemoteControl] \(operation) - \(message)"
LoggingService.shared.logRemoteControlDebug(fullMessage)
}

View File

@@ -116,8 +116,10 @@ final class RemoteControlCoordinator {
}
/// Log debug-level message. Only logs if verbose remote control logging is enabled.
/// The master "Enable Logging" toggle takes precedence over the verbose flag.
private func rcDebug(_ operation: String, _ message: String) {
guard UserDefaults.standard.bool(forKey: "verboseRemoteControlLogging") else { return }
guard UserDefaults.standard.bool(forKey: "loggingEnabled"),
UserDefaults.standard.bool(forKey: "verboseRemoteControlLogging") else { return }
let fullMessage = "[RemoteControl] \(operation) - \(message)"
LoggingService.shared.logRemoteControlDebug(fullMessage)
}