From ee5dcda3d1647f2956ad0a800704eae973df6708 Mon Sep 17 00:00:00 2001 From: Jamil Date: Tue, 16 Apr 2024 07:32:53 -0700 Subject: [PATCH] fix(apple): Append to Swift logfile instead of overwriting each time (#4633) Fixes #4522 --------- Signed-off-by: Jamil --- .../Sources/FirezoneKit/Helpers/Log.swift | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/swift/apple/FirezoneKit/Sources/FirezoneKit/Helpers/Log.swift b/swift/apple/FirezoneKit/Sources/FirezoneKit/Helpers/Log.swift index 515ba7029..0c972f191 100644 --- a/swift/apple/FirezoneKit/Sources/FirezoneKit/Helpers/Log.swift +++ b/swift/apple/FirezoneKit/Sources/FirezoneKit/Helpers/Log.swift @@ -74,7 +74,7 @@ private final class LogWriter { private let workQueue: DispatchQueue private let category: Log.Category private let logger: Logger - private let logFileURL: URL + private let handle: FileHandle private let dateFormatter: ISO8601DateFormatter private let jsonEncoder: JSONEncoder @@ -97,20 +97,32 @@ private final class LogWriter { logger.error("Log directory isn't acceptable!") return nil } - self.logFileURL = folderURL + + let logFileURL = folderURL .appendingPathComponent(dateFormatter.string(from: Date())) .appendingPathExtension("log") // Create log file - guard fileManager.createFile(atPath: self.logFileURL.path, contents: "".data(using: .utf8)) + guard fileManager.createFile(atPath: logFileURL.path, contents: "".data(using: .utf8)), + let handle = try? FileHandle(forWritingTo: logFileURL), + let _ = try? handle.seekToEnd() else { - logger.error("Could not create log file: \(self.logFileURL.path)") + logger.error("Could not create log file: \(logFileURL.path)") return nil } + self.handle = handle self.workQueue = DispatchQueue(label: "LogWriter.workQueue", qos: .utility) } + deinit { + do { + try self.handle.close() + } catch { + logger.error("Could not close logfile: \(error)") + } + } + func write(severity: Severity, message: String) { let logEntry = LogEntry( time: dateFormatter.string(from: Date()), @@ -127,12 +139,6 @@ private final class LogWriter { jsonData.append(newLineData) - workQueue.async { - do { - try jsonData.write(to: self.logFileURL, options: .atomic) - } catch { - self.logger.error("Could not write LogEntry! \(error)") - } - } + workQueue.async { self.handle.write(jsonData) } } }