Skip to content

Commit d4b4a4f

Browse files
committed
Some redesign to better match protocols and semantics
1 parent 9de6703 commit d4b4a4f

File tree

2 files changed

+42
-34
lines changed

2 files changed

+42
-34
lines changed

Sources/FileLogging/swift_log_file.swift

+24-13
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,33 @@ struct FileHandlerOutputStream: TextOutputStream {
3030
}
3131
}
3232

33+
public struct FileLogging {
34+
let stream: TextOutputStream
35+
private var localFile: URL
36+
37+
public init(to localFile: URL) throws {
38+
self.stream = try FileHandlerOutputStream(localFile: localFile)
39+
self.localFile = localFile
40+
}
41+
42+
public func handler(label: String) -> FileLogHandler {
43+
return FileLogHandler(label: label, fileLogger: self)
44+
}
45+
46+
public static func logger(label: String, localFile url: URL) throws -> Logger {
47+
let logging = try FileLogging(to: url)
48+
return Logger(label: label, factory: logging.handler)
49+
}
50+
}
51+
3352
// Adapted from https://github.com/apple/swift-log.git
34-
// Changed from using a struct to using a class because of: error: Partial application of 'mutating' method is not allowed
35-
// when I try to do: `LoggingSystem.bootstrap(logFileHandler.handler)`
3653

3754
/// `FileLogHandler` is a simple implementation of `LogHandler` for directing
3855
/// `Logger` output to a local file. Appends log output to this file, even across constructor calls.
39-
public class FileLogHandler: LogHandler {
56+
public struct FileLogHandler: LogHandler {
4057
private let stream: TextOutputStream
4158
private var label: String
42-
59+
4360
public var logLevel: Logger.Level = .info
4461

4562
private var prettyMetadata: String?
@@ -58,22 +75,16 @@ public class FileLogHandler: LogHandler {
5875
}
5976
}
6077

61-
public static func fileLogger(label: String, localFile url: URL) throws -> Logger {
62-
let logFileHandler = try FileLogHandler(label: label, localFile: url)
63-
return Logger(label: label, factory: logFileHandler.handler)
78+
public init(label: String, fileLogger: FileLogging) {
79+
self.label = label
80+
self.stream = fileLogger.stream
6481
}
6582

6683
public init(label: String, localFile url: URL) throws {
6784
self.label = label
6885
self.stream = try FileHandlerOutputStream(localFile: url)
6986
}
7087

71-
// Necessary because the factory method used in the swift logger doesn't allow a throwing constructor.
72-
public func handler(label: String) -> LogHandler {
73-
self.label = label
74-
return self
75-
}
76-
7788
public func log(level: Logger.Level,
7889
message: Logger.Message,
7990
metadata: Logger.Metadata?,

Tests/swift-log-fileTests/swift_log_fileTests.swift

+18-21
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ final class swift_log_fileTests: XCTestCase {
1313
func testLogToFileUsingBootstrap() throws {
1414
let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName)
1515
print("\(logFileURL)")
16-
let logFileHandler = try FileLogHandler(label: "Foobar", localFile: logFileURL)
16+
let fileLogger = try FileLogging(to: logFileURL)
1717
// Using `bootstrapInternal` so that running `swift test` won't fail. If using this in production code, just use `bootstrap`.
18-
LoggingSystem.bootstrapInternal(logFileHandler.handler)
18+
LoggingSystem.bootstrapInternal(fileLogger.handler)
1919

2020
let logger = Logger(label: "Test")
2121

@@ -26,9 +26,9 @@ final class swift_log_fileTests: XCTestCase {
2626
func testLogToFileAppendsAcrossLoggerCalls() throws {
2727
let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName)
2828
print("\(logFileURL)")
29-
let logFileHandler = try FileLogHandler(label: "Foobar", localFile: logFileURL)
29+
let fileLogger = try FileLogging(to: logFileURL)
3030
// Using `bootstrapInternal` so that running `swift test` won't fail. If using this in production code, just use `bootstrap`.
31-
LoggingSystem.bootstrapInternal(logFileHandler.handler)
31+
LoggingSystem.bootstrapInternal(fileLogger.handler)
3232
let logger = Logger(label: "Test")
3333

3434
// Not really an error.
@@ -44,14 +44,13 @@ final class swift_log_fileTests: XCTestCase {
4444
func testLogToFileAppendsAcrossConstructorCalls() throws {
4545
let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName)
4646
print("\(logFileURL)")
47-
48-
let logFileHandler1 = try FileLogHandler(label: "Foobar", localFile: logFileURL)
49-
let logger1 = Logger(label: "Test", factory: logFileHandler1.handler)
47+
let fileLogger = try FileLogging(to: logFileURL)
48+
49+
let logger1 = Logger(label: "Test", factory: fileLogger.handler)
5050
logger1.error("Test Test Test")
5151
let fileSize1 = try getFileSize(file: logFileURL)
5252

53-
let logFileHandler2 = try FileLogHandler(label: "Foobar", localFile: logFileURL)
54-
let logger2 = Logger(label: "Test", factory: logFileHandler2.handler)
53+
let logger2 = Logger(label: "Test", factory: fileLogger.handler)
5554
logger2.error("Test Test Test")
5655
let fileSize2 = try getFileSize(file: logFileURL)
5756

@@ -61,31 +60,28 @@ final class swift_log_fileTests: XCTestCase {
6160
// Adapted from https://nshipster.com/swift-log/
6261
func testLogToBothFileAndConsole() throws {
6362
let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName)
63+
let fileLogger = try FileLogging(to: logFileURL)
6464

6565
LoggingSystem.bootstrap { label in
66-
var handlers = [LogHandler]()
67-
68-
// I would prefer if the `bootstrap` does a rethrow.
69-
if let logFileHandler = try? FileLogHandler(label: label, localFile: logFileURL) {
70-
handlers += [logFileHandler]
71-
}
72-
73-
handlers += [StreamLogHandler.standardOutput(label: label)]
66+
let handlers:[LogHandler] = [
67+
FileLogHandler(label: label, fileLogger: fileLogger),
68+
StreamLogHandler.standardOutput(label: label)
69+
]
7470

7571
return MultiplexLogHandler(handlers)
7672
}
7773

7874
let logger = Logger(label: "Test")
7975

80-
// Manually check that the output also shows up in the Xcode console.
76+
// TODO: Manually check that the output also shows up in the Xcode console.
8177
logger.error("Test Test Test")
8278
}
8379

8480
func testLoggingUsingLoggerFactoryConstructor() throws {
8581
let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName)
82+
let fileLogger = try FileLogging(to: logFileURL)
8683

87-
let logFileHandler = try FileLogHandler(label: "Foobar", localFile: logFileURL)
88-
let logger = Logger(label: "Test", factory: logFileHandler.handler)
84+
let logger = Logger(label: "Test", factory: fileLogger.handler)
8985

9086
logger.error("Test Test Test")
9187
let fileSize1 = try getFileSize(file: logFileURL)
@@ -98,7 +94,8 @@ final class swift_log_fileTests: XCTestCase {
9894

9995
func testLoggingUsingConvenienceMethod() throws {
10096
let logFileURL = try getDocumentsDirectory().appendingPathComponent(logFileName)
101-
let logger = try FileLogHandler.fileLogger(label: "Foobar", localFile: logFileURL)
97+
98+
let logger = try FileLogging.logger(label: "Foobar", localFile: logFileURL)
10299

103100
logger.error("Test Test Test")
104101
let fileSize1 = try getFileSize(file: logFileURL)

0 commit comments

Comments
 (0)