Skip to content

Commit 5441305

Browse files
committed
FFI log forwarding
1 parent c2cf1c9 commit 5441305

File tree

1 file changed

+65
-8
lines changed

1 file changed

+65
-8
lines changed

Sources/LiveKit/Support/Logger.swift

Lines changed: 65 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import OSLog
1818
internal import LiveKitWebRTC
19+
internal import LiveKitFFI
1920

2021
// MARK: - Logger
2122

@@ -108,30 +109,36 @@ public struct PrintLogger: Logger {
108109
/// A logger that logs to OSLog
109110
/// - Parameter minLevel: The minimum level to log
110111
/// - Parameter rtc: Whether to log WebRTC output
112+
/// - Parameter ffi: Whether to log Rust FFI output
111113
open class OSLogger: Logger, @unchecked Sendable {
112114
private static let subsystem = "io.livekit.sdk"
113115

114-
private let queue = DispatchQueue(label: "io.livekit.oslogger", qos: .utility)
116+
private static let queue = DispatchQueue(label: "io.livekit.oslogger", qos: .utility)
117+
118+
private nonisolated(unsafe) static var ffiBootstrapped = false
119+
115120
private var logs: [String: OSLog] = [:]
116121

117122
private lazy var rtcLogger = LKRTCCallbackLogger()
123+
private var ffiLogForwardTask: Task<Void, Never>?
118124

119125
private let minLevel: LogLevel
120126

121-
public init(minLevel: LogLevel = .info, rtc: Bool = false) {
127+
public init(minLevel: LogLevel = .info, rtc: Bool = false, ffi: Bool = true) {
122128
self.minLevel = minLevel
123129

124-
guard rtc else { return }
130+
if rtc {
131+
startRTCLogForwarding(minLevel: minLevel)
132+
}
125133

126-
let rtcLog = OSLog(subsystem: Self.subsystem, category: "WebRTC")
127-
rtcLogger.severity = minLevel.rtcSeverity
128-
rtcLogger.start { message, severity in
129-
os_log("%{public}@", log: rtcLog, type: severity.osLogType, message)
134+
if ffi {
135+
startFFILogForwarding(minLevel: minLevel)
130136
}
131137
}
132138

133139
deinit {
134140
rtcLogger.stop()
141+
ffiLogForwardTask?.cancel()
135142
}
136143

137144
public func log(
@@ -155,7 +162,7 @@ open class OSLogger: Logger, @unchecked Sendable {
155162

156163
let metadata = buildScopedMetadataString()
157164

158-
queue.async {
165+
Self.queue.async {
159166
func getOSLog(for type: Any.Type) -> OSLog {
160167
let typeName = String(describing: type)
161168

@@ -171,6 +178,36 @@ open class OSLogger: Logger, @unchecked Sendable {
171178
os_log("%{public}@", log: getOSLog(for: type), type: level.osLogType, "\(type).\(function) \(message)\(metadata)")
172179
}
173180
}
181+
182+
private func startRTCLogForwarding(minLevel: LogLevel) {
183+
let rtcLog = OSLog(subsystem: Self.subsystem, category: "WebRTC")
184+
185+
rtcLogger.severity = minLevel.rtcSeverity
186+
rtcLogger.start { message, severity in
187+
os_log("%{public}@", log: rtcLog, type: severity.osLogType, message)
188+
}
189+
}
190+
191+
private func startFFILogForwarding(minLevel: LogLevel) {
192+
Self.queue.sync {
193+
if !Self.ffiBootstrapped {
194+
logForwardBootstrap(level: minLevel.logForwardFilter)
195+
Self.ffiBootstrapped = true
196+
}
197+
}
198+
199+
let ffiLog = OSLog(subsystem: Self.subsystem, category: "FFI")
200+
201+
ffiLogForwardTask = Task(priority: .utility) {
202+
for await entry in AsyncStream(unfolding: logForwardReceive) {
203+
guard !Task.isCancelled else { break }
204+
205+
let message = "\(entry.target) \(entry.message)"
206+
207+
os_log("%{public}@", log: ffiLog, type: entry.level.osLogType, message)
208+
}
209+
}
210+
}
174211
}
175212

176213
// MARK: - Loggable
@@ -236,6 +273,15 @@ public enum LogLevel: Int, Sendable, Comparable, CustomStringConvertible {
236273
}
237274
}
238275

276+
var logForwardFilter: LogForwardFilter {
277+
switch self {
278+
case .debug: .debug
279+
case .info: .info
280+
case .warning: .warn
281+
case .error: .error
282+
}
283+
}
284+
239285
@inlinable
240286
public static func < (lhs: LogLevel, rhs: LogLevel) -> Bool {
241287
lhs.rawValue < rhs.rawValue
@@ -263,3 +309,14 @@ extension LKRTCLoggingSeverity {
263309
}
264310
}
265311
}
312+
313+
extension LogForwardLevel {
314+
var osLogType: OSLogType {
315+
switch self {
316+
case .error: .error
317+
case .warn: .default
318+
case .info: .info
319+
case .debug, .trace: .debug
320+
}
321+
}
322+
}

0 commit comments

Comments
 (0)