diff --git a/.gitignore b/.gitignore index f2654ee..8c2660f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .build .swiftpm +.DS_Store diff --git a/Package.resolved b/Package.resolved index 6457517..36ab510 100644 --- a/Package.resolved +++ b/Package.resolved @@ -9,15 +9,6 @@ "revision": "173f567a2dfec11d74588eea82cecea555bdc0bc", "version": "1.4.0" } - }, - { - "package": "XCGLogger", - "repositoryURL": "https://github.com/DaveWoodCom/XCGLogger.git", - "state": { - "branch": null, - "revision": "a9c4667b247928a29bdd41be2ec2c8d304215a54", - "version": "7.0.1" - } } ] }, diff --git a/Package.swift b/Package.swift index d1e5f8a..b07b993 100644 --- a/Package.swift +++ b/Package.swift @@ -11,21 +11,18 @@ let package = Package( targets: ["FileLogging"]), ], dependencies: [ - .package(url: "https://github.com/apple/swift-log.git", from: "1.0.0"), - .package(url: "https://github.com/DaveWoodCom/XCGLogger.git", from: "7.0.0") + .package(url: "https://github.com/apple/swift-log.git", from: "1.0.0") ], targets: [ .target( name: "FileLogging", dependencies: [ - "XCGLogger", .product(name: "Logging", package: "swift-log") ]), .testTarget( name: "swift-log-fileTests", dependencies: [ - "FileLogging", - "XCGLogger" + "FileLogging" ]), ] ) diff --git a/README.md b/README.md index 31b0121..00b86eb 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ [SwiftLog](https://github.com/apple/swift-log) compatible file log handler. -This currently only supports iOS. - ## Example: Just logging to a file ```swift @@ -32,33 +30,4 @@ let logger = Logger(label: "Test") Note in that last example, if you use `LoggingSystem.bootstrap`, make sure to create your `Logger` *after* the `LoggingSystem.bootstrap` usage (or you won't get the effects of the `LoggingSystem.bootstrap`). -## Example: Using XCGLogger - -[XCGLogger](https://github.com/DaveWoodCom/XCGLogger.git) supports rotating file logs amongst other features. - -```swift -let logFileURL = URL(/* your local log file here */) -let xcgLogger = /* Make your XCGLogger, using logFileURL */ -let logger = XCGLogging.logger(label: "Test", logger: xcgLogger) -logger.error("Test Test Test") -``` - -## Example: Logging to both the standard output (Xcode console if using Xcode) and a file using XCGLogger. - -```swift -let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName) -let xcgLogger = /* Make your XCGLogger, using logFileURL */ - -LoggingSystem.bootstrap { label in - let handlers:[LogHandler] = [ - XCGLoggerHandler(label: label, logger: xcgLogger), - StreamLogHandler.standardOutput(label: label) - ] - - return MultiplexLogHandler(handlers) -} - -let logger = Logger(label: "Test") -``` - For more examples, see the unit tests and refer to [apple/swift-log's README](https://github.com/apple/swift-log#the-core-concepts) diff --git a/Sources/FileLogging/swift_log_xcglogger.swift b/Sources/FileLogging/swift_log_xcglogger.swift deleted file mode 100644 index 1926df4..0000000 --- a/Sources/FileLogging/swift_log_xcglogger.swift +++ /dev/null @@ -1,84 +0,0 @@ - -import Logging -import Foundation -import XCGLogger - -public struct XCGLogging { - let logger:XCGLogger - - public init(logger:XCGLogger) { - self.logger = logger - } - - public func handler(label: String) -> XCGLoggerHandler { - return XCGLoggerHandler(label: label, logger: logger) - } - - public static func logger(label: String, logger:XCGLogger) -> Logger { - let logging = XCGLogging(logger: logger) - return Logger(label: label, factory: logging.handler) - } -} - -/// `XCGLoggerHandler` is an implementation of `LogHandler` that makes use of the XCGLogger. -public struct XCGLoggerHandler: LogHandler { - private var xcgLogger:XCGLogger - private var label: String - - public var logLevel: Logger.Level = .info - - public var metadata = Logger.Metadata() - - public subscript(metadataKey metadataKey: String) -> Logger.Metadata.Value? { - get { - return self.metadata[metadataKey] - } - set { - self.metadata[metadataKey] = newValue - } - } - - public init(label: String, logger:XCGLogger) { - self.label = label - self.xcgLogger = logger - } - - public func log(level: Logger.Level, - message: Logger.Message, - metadata: Logger.Metadata?, - source: String, - file: String = #file, - function: String = #function, - line: UInt = #line) { - - let xcgLoggerLevel = convert(level: level) - xcgLogger.logln(xcgLoggerLevel, functionName: function, fileName: file, lineNumber: Int(line), userInfo: metadata ?? self.metadata) { - return message - } - } - - func convert(level: Logger.Level) -> XCGLogger.Level { - switch level { - case .trace: - return .verbose - - case .debug: - return .debug - - case .info: - return .info - - case .notice: - return .notice - - case .warning: - return .warning - - case .error: - return .error - - case .critical: - return .severe - } - } -} diff --git a/Tests/swift-log-fileTests/swift_log_xcgloggerTests.swift b/Tests/swift-log-fileTests/swift_log_xcgloggerTests.swift deleted file mode 100644 index f764342..0000000 --- a/Tests/swift-log-fileTests/swift_log_xcgloggerTests.swift +++ /dev/null @@ -1,169 +0,0 @@ -// -// swift_log_xcgloggerTests.swift -// swift-log-fileTests -// -// Created by Christopher G Prince on 2/6/21. -// - -import XCTest -@testable import FileLogging -@testable import Logging -import XCGLogger - -class swift_log_xcgloggerTests: XCTestCase, Utilities { - override func setUpWithError() throws { - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDownWithError() throws { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - - let logFileName = "LogFile.txt" - - func testLogToFileUsingBootstrap() throws { - let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName) - print("\(logFileURL)") - - let xcgLogger = makeFileXCGLogger(logFileURL: logFileURL) - let fileLogger = XCGLogging(logger: xcgLogger) - - // Using `bootstrapInternal` so that running `swift test` won't fail. If using this in production code, just use `bootstrap`. - LoggingSystem.bootstrapInternal(fileLogger.handler) - - let logger = Logger(label: "Test") - - logger.error("Test Test Test") - } - - func testLogToFileAppendsAcrossLoggerCalls() throws { - let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName) - print("\(logFileURL)") - - let xcgLogger = makeFileXCGLogger(logFileURL: logFileURL) - let fileLogger = XCGLogging(logger: xcgLogger) - - // Using `bootstrapInternal` so that running `swift test` won't fail. If using this in production code, just use `bootstrap`. - LoggingSystem.bootstrapInternal(fileLogger.handler) - let logger = Logger(label: "Test") - - // Not really an error. - logger.error("Test Test Test") - let fileSize1 = try getFileSize(file: logFileURL) - - logger.error("Test Test Test") - let fileSize2 = try getFileSize(file: logFileURL) - - XCTAssert(fileSize2 > fileSize1) - try? FileManager.default.removeItem(at: logFileURL) - } - - func testLogToFileAppendsAcrossConstructorCalls() throws { - let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName) - print("\(logFileURL)") - - let xcgLogger = makeFileXCGLogger(logFileURL: logFileURL) - let fileLogger = XCGLogging(logger: xcgLogger) - - let logger1 = Logger(label: "Test", factory: fileLogger.handler) - logger1.error("Test Test Test") - let fileSize1 = try getFileSize(file: logFileURL) - - let logger2 = Logger(label: "Test", factory: fileLogger.handler) - logger2.error("Test Test Test") - let fileSize2 = try getFileSize(file: logFileURL) - - XCTAssert(fileSize2 > fileSize1) - try? FileManager.default.removeItem(at: logFileURL) - } - - func testLogToBothFileAndConsole() throws { - let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName) - let xcgLogger = makeFileXCGLogger(logFileURL: logFileURL) - - LoggingSystem.bootstrap { label in - let handlers:[LogHandler] = [ - XCGLoggerHandler(label: label, logger: xcgLogger), - StreamLogHandler.standardOutput(label: label) - ] - - return MultiplexLogHandler(handlers) - } - - let logger = Logger(label: "Test") - - // TODO: Manually check that the output also shows up in the Xcode console. - logger.error("Test Test Test Boogba") - try? FileManager.default.removeItem(at: logFileURL) - } - - func testLoggingUsingLoggerFactoryConstructor() throws { - let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName) - - let xcgLogger = makeFileXCGLogger(logFileURL: logFileURL) - let fileLogger = XCGLogging(logger: xcgLogger) - - let logger = Logger(label: "Test", factory: fileLogger.handler) - - logger.error("Test Test Test") - let fileSize1 = try getFileSize(file: logFileURL) - - logger.error("Test Test Test") - let fileSize2 = try getFileSize(file: logFileURL) - - XCTAssert(fileSize2 > fileSize1) - try? FileManager.default.removeItem(at: logFileURL) - } - - func testLoggingUsingConvenienceMethod() throws { - let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName) - - let xcgLogger = makeFileXCGLogger(logFileURL: logFileURL) - let logger = XCGLogging.logger(label: "Test", logger: xcgLogger) - - logger.error("Test Test Test") - let fileSize1 = try getFileSize(file: logFileURL) - - logger.error("Test Test Test") - let fileSize2 = try getFileSize(file: logFileURL) - - XCTAssert(fileSize2 > fileSize1) - try? FileManager.default.removeItem(at: logFileURL) - } - - // MARK: Helpers - - func makeFileXCGLogger(logFileURL: URL, level: XCGLogger.Level = .verbose) -> XCGLogger { - // Create a logger object with no destinations - let log = XCGLogger(identifier: "advancedLogger", includeDefaultDestinations: false) - - // Create a file log destination - let fileDestination = AutoRotatingFileDestination(writeToFile: logFileURL.path, identifier: "advancedLogger.fileDestination", shouldAppend: true) - - // Optionally set some configuration options - fileDestination.outputLevel = level - fileDestination.showLogIdentifier = false - fileDestination.showFunctionName = true - fileDestination.showThreadName = true - fileDestination.showLevel = true - fileDestination.showFileName = true - fileDestination.showLineNumber = true - fileDestination.showDate = true - - // Trying to get max total log size that could be sent to developer to be around 1MByte; this comprises one current log file and two archived log files. - fileDestination.targetMaxFileSize = (1024 * 1024) / 3 // 1/3 MByte - - // These are archived log files. - fileDestination.targetMaxLogFiles = 2 - - // Process this destination in the background - fileDestination.logQueue = XCGLogger.logQueue - - // Add the destination to the logger - log.add(destination: fileDestination) - - // Add basic app info, version info etc, to the start of the logs - log.logAppDetails() - return log - } -}