diff options
| author | Andrew Bulhak <andrew.bulhak@mullvad.net> | 2024-04-11 12:55:52 +0200 |
|---|---|---|
| committer | Bug Magnet <marco.nikic@mullvad.net> | 2024-04-17 12:40:40 +0200 |
| commit | 6cd934154cda7e4e33b6a62dbdec982a96a219c8 (patch) | |
| tree | 38602dbd862aa10ae0aad5f852e23bdcb82963ef | |
| parent | 4654acb952e4b4024329f99bb0b4f780154bdd12 (diff) | |
| download | mullvadvpn-6cd934154cda7e4e33b6a62dbdec982a96a219c8.tar.xz mullvadvpn-6cd934154cda7e4e33b6a62dbdec982a96a219c8.zip | |
Move log file header writing to LogFileOutputStream
| -rw-r--r-- | ios/MullvadLogging/LogFileOutputStream.swift | 25 | ||||
| -rw-r--r-- | ios/MullvadLogging/Logging.swift | 10 | ||||
| -rw-r--r-- | ios/MullvadVPN/AppDelegate.swift | 6 | ||||
| -rw-r--r-- | ios/MullvadVPNTests/LoggingTests.swift | 22 | ||||
| -rw-r--r-- | ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift | 4 |
5 files changed, 39 insertions, 28 deletions
diff --git a/ios/MullvadLogging/LogFileOutputStream.swift b/ios/MullvadLogging/LogFileOutputStream.swift index a3b7ca4caa..26b059638e 100644 --- a/ios/MullvadLogging/LogFileOutputStream.swift +++ b/ios/MullvadLogging/LogFileOutputStream.swift @@ -19,6 +19,7 @@ class LogFileOutputStream: TextOutputStream { private let fileURL: URL private let encoding: String.Encoding private let maxBufferCapacity: Int + private let fileHeader: String private var state: State = .closed { didSet { @@ -44,10 +45,11 @@ class LogFileOutputStream: TextOutputStream { case waitingToReopen } - init(fileURL: URL, encoding: String.Encoding = .utf8, maxBufferCapacity: Int = 16 * 1024) { + init(fileURL: URL, header: String, encoding: String.Encoding = .utf8, maxBufferCapacity: Int = 16 * 1024) { self.fileURL = fileURL self.encoding = encoding self.maxBufferCapacity = maxBufferCapacity + self.fileHeader = header } deinit { @@ -66,7 +68,7 @@ class LogFileOutputStream: TextOutputStream { switch state { case .closed: do { - let fileHandle = try openFile() + let fileHandle = try openFileWithHeader(fileHeader) state = .opened(fileHandle) try write(fileHandle: fileHandle, data: data) } catch { @@ -137,15 +139,22 @@ class LogFileOutputStream: TextOutputStream { timer = nil } + private func openFileWithHeader(_ header: String) throws -> FileHandle { + let fileHandle = try openFile() + + let messageData = + "\(header)\n" + .data(using: encoding, allowLossyConversion: true)! + try write(fileHandle: fileHandle, data: messageData) + + return fileHandle + } + private func reopenFile() { do { - let fileHandle = try openFile() - // Write a message indicating that the file was reopened. - let messageData = - "<Log file re-opened after failure. Buffered \(buffer.count) bytes of messages>\n" - .data(using: encoding, allowLossyConversion: true)! - try write(fileHandle: fileHandle, data: messageData) + let fileHandle = + try openFileWithHeader("<Log file re-opened after failure. Buffered \(buffer.count) bytes of messages>") // Write all buffered messages. if !buffer.isEmpty { diff --git a/ios/MullvadLogging/Logging.swift b/ios/MullvadLogging/Logging.swift index c6d86a549b..b8ad66c191 100644 --- a/ios/MullvadLogging/Logging.swift +++ b/ios/MullvadLogging/Logging.swift @@ -21,8 +21,11 @@ public struct LoggerBuilder { public var metadata: Logger.Metadata = [:] public var logLevel: Logger.Level = .debug + public var header: String - public init() {} + public init(header: String) { + self.header = header + } public mutating func addFileOutput(fileURL: URL) { let logsDirectoryURL = fileURL.deletingLastPathComponent() @@ -42,19 +45,18 @@ public struct LoggerBuilder { logRotationErrors.append(error) } - outputs.append(.fileOutput(LogFileOutputStream(fileURL: fileURL))) + outputs.append(.fileOutput(LogFileOutputStream(fileURL: fileURL, header: header))) } public mutating func addOSLogOutput(subsystem: String) { outputs.append(.osLogOutput(subsystem)) } - public func install(header: String) { + public func install() { LoggingSystem.bootstrap { label -> LogHandler in let logHandlers: [LogHandler] = outputs.map { output in switch output { case let .fileOutput(stream): - stream.write("\(header)\n") return CustomFormatLogHandler(label: label, streams: [stream]) case let .osLogOutput(subsystem): diff --git a/ios/MullvadVPN/AppDelegate.swift b/ios/MullvadVPN/AppDelegate.swift index e79a1226a8..88c9b0e4e6 100644 --- a/ios/MullvadVPN/AppDelegate.swift +++ b/ios/MullvadVPN/AppDelegate.swift @@ -352,12 +352,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD // MARK: - Private private func configureLogging() { - var loggerBuilder = LoggerBuilder() - loggerBuilder.addFileOutput(fileURL: ApplicationConfiguration.newLogFileURL(for: .mainApp)) + var loggerBuilder = LoggerBuilder(header: "MullvadVPN version \(Bundle.main.productVersion)") + loggerBuilder.addFileOutput(fileURL: ApplicationConfiguration.logFileURL(for: .mainApp)) #if DEBUG loggerBuilder.addOSLogOutput(subsystem: ApplicationTarget.mainApp.bundleIdentifier) #endif - loggerBuilder.install(header: "MullvadVPN version \(Bundle.main.productVersion)") + loggerBuilder.install() logger = Logger(label: "AppDelegate") diff --git a/ios/MullvadVPNTests/LoggingTests.swift b/ios/MullvadVPNTests/LoggingTests.swift index be21d14b7c..e422f3d605 100644 --- a/ios/MullvadVPNTests/LoggingTests.swift +++ b/ios/MullvadVPNTests/LoggingTests.swift @@ -7,18 +7,16 @@ // import Foundation -import XCTest @testable import MullvadLogging +import XCTest class MullvadLoggingTests: XCTestCase { - func temporaryFileURL() -> URL { - // Create a URL for an unique file in the system's temporary directory. let directory = NSTemporaryDirectory() let filename = UUID().uuidString let fileURL = URL(fileURLWithPath: directory).appendingPathComponent(filename) - + // Add a teardown block to delete any file at `fileURL`. addTeardownBlock { do { @@ -33,22 +31,24 @@ class MullvadLoggingTests: XCTestCase { XCTFail("Error while deleting temporary file: \(error)") } } - + // Return the temporary file URL for use in a test method. return fileURL } func testLogHeader() { let expectedHeader = "Header of a log file" - - var builder = LoggerBuilder() + + var builder = LoggerBuilder(header: expectedHeader) let fileURL = temporaryFileURL() builder.addFileOutput(fileURL: fileURL) - - builder.install(header: expectedHeader) - + + builder.install() + + Logger(label: "test").info(":-P") + let contents = String(decoding: try! Data(contentsOf: fileURL), as: UTF8.self) - + XCTAssert(contents.hasPrefix(expectedHeader)) } } diff --git a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift index 7cdc357150..628828f528 100644 --- a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift +++ b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift @@ -160,14 +160,14 @@ class PacketTunnelProvider: NEPacketTunnelProvider { extension PacketTunnelProvider { private static func configureLogging() { - var loggerBuilder = LoggerBuilder() + var loggerBuilder = LoggerBuilder(header: "PacketTunnel version \(Bundle.main.productVersion)") let pid = ProcessInfo.processInfo.processIdentifier loggerBuilder.metadata["pid"] = .string("\(pid)") loggerBuilder.addFileOutput(fileURL: ApplicationConfiguration.newLogFileURL(for: .packetTunnel)) #if DEBUG loggerBuilder.addOSLogOutput(subsystem: ApplicationTarget.packetTunnel.bundleIdentifier) #endif - loggerBuilder.install(header: "PacketTunnel version \(Bundle.main.productVersion)") + loggerBuilder.install() } private func parseStartOptions(_ options: [String: NSObject]) -> StartOptions { |
