1616
1717import OSLog
1818internal 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
111113open 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