Skip to content

Commit f0a5088

Browse files
authored
make MultiplexLogHandler a value (#12)
1 parent 766ff20 commit f0a5088

File tree

3 files changed

+29
-12
lines changed

3 files changed

+29
-12
lines changed

Diff for: Sources/Logging/Logging.swift

+9-12
Original file line numberDiff line numberDiff line change
@@ -474,8 +474,7 @@ extension Logger {
474474
/// The first `LogHandler` passed to the initialisation function of `MultiplexLogHandler` control the `logLevel` as
475475
/// well as the `metadata` for this `LogHandler`. Any subsequent `LogHandler`s used to initialise a
476476
/// `MultiplexLogHandler` are merely to emit the log message to another place.
477-
public class MultiplexLogHandler: LogHandler {
478-
private let lock = Lock()
477+
public struct MultiplexLogHandler: LogHandler {
479478
private var handlers: [LogHandler]
480479

481480
public init(_ handlers: [LogHandler]) {
@@ -488,7 +487,9 @@ public class MultiplexLogHandler: LogHandler {
488487
return self.handlers[0].logLevel
489488
}
490489
set {
491-
self.mutateHandlers { $0.logLevel = newValue }
490+
self.mutatingForEachHandler {
491+
$0.logLevel = newValue
492+
}
492493
}
493494
}
494495

@@ -503,7 +504,7 @@ public class MultiplexLogHandler: LogHandler {
503504
return self.handlers[0].metadata
504505
}
505506
set {
506-
self.mutateHandlers { $0.metadata = newValue }
507+
self.mutatingForEachHandler { $0.metadata = newValue }
507508
}
508509
}
509510

@@ -512,18 +513,14 @@ public class MultiplexLogHandler: LogHandler {
512513
return self.handlers[0].metadata[metadataKey]
513514
}
514515
set {
515-
self.mutateHandlers { $0[metadataKey: metadataKey] = newValue }
516+
self.mutatingForEachHandler { $0[metadataKey: metadataKey] = newValue }
516517
}
517518
}
518519

519-
private func mutateHandlers(mutator: (inout LogHandler) -> Void) {
520-
var newHandlers = [LogHandler]()
521-
self.handlers.forEach {
522-
var handler = $0
523-
mutator(&handler)
524-
newHandlers.append(handler)
520+
private mutating func mutatingForEachHandler(_ mutator: (inout LogHandler) -> Void) {
521+
for index in self.handlers.indices {
522+
mutator(&self.handlers[index])
525523
}
526-
self.lock.withLock { self.handlers = newHandlers }
527524
}
528525
}
529526

Diff for: Tests/LoggingTests/LoggingTest+XCTest.swift

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ extension LoggingTest {
3838
("testAllLogLevelsWork", testAllLogLevelsWork),
3939
("testLogMessageWithStringInterpolation", testLogMessageWithStringInterpolation),
4040
("testLoggingAString", testLoggingAString),
41+
("testMultiplexerIsValue", testMultiplexerIsValue),
4142
]
4243
}
4344
}

Diff for: Tests/LoggingTests/LoggingTest.swift

+19
Original file line numberDiff line numberDiff line change
@@ -286,4 +286,23 @@ class LoggingTest: XCTestCase {
286286
logger.debug("\(anActualString)")
287287
testLogging.history.assertExist(level: .debug, message: "hello world!")
288288
}
289+
290+
func testMultiplexerIsValue() {
291+
let multi = MultiplexLogHandler([StdoutLogHandler(label: "x"), StdoutLogHandler(label: "y")])
292+
LoggingSystem.bootstrapInternal { _ in
293+
print("new multi")
294+
return multi
295+
}
296+
var logger1: Logger = {
297+
var logger = Logger(label: "foo")
298+
logger.logLevel = .debug
299+
return logger
300+
}()
301+
XCTAssertEqual(.debug, logger1.logLevel)
302+
var logger2 = logger1
303+
logger2.logLevel = .error
304+
XCTAssertEqual(.error, logger2.logLevel)
305+
XCTAssertEqual(.debug, logger1.logLevel)
306+
logger1.error("hey")
307+
}
289308
}

0 commit comments

Comments
 (0)