1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2022-2023 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import Logging
import NIOConcurrencyHelpers
final class LogRecorderHandler: LogHandler {
let state = NIOLockedValueBox<State>(State())
struct FullLogMessage: Equatable {
var level: Logger.Level
var message: Logger.Message
var metadata: Logger.Metadata
}
struct State {
var metadata: [String: Logger.Metadata.Value] = [:]
var messages: [FullLogMessage] = []
var logLevel: Logger.Level = .trace
}
func makeLogger() -> Logger {
Logger(label: "LogRecorder for tests", factory: { _ in self })
}
func log(
level: Logger.Level,
message: Logger.Message,
metadata: Logger.Metadata?,
source: String,
file: String,
function: String,
line: UInt
) {
let fullMessage = FullLogMessage(
level: level,
message: message,
metadata: self.metadata.merging(metadata ?? [:]) { _, r in r }
)
self.state.withLockedValue { state in
state.messages.append(fullMessage)
}
}
var recordedMessages: [FullLogMessage] {
self.state.withLockedValue { $0.messages }
}
subscript(metadataKey key: String) -> Logging.Logger.Metadata.Value? {
get {
self.state.withLockedValue {
$0.metadata[key]
}
}
set {
self.state.withLockedValue {
$0.metadata[key] = newValue
}
}
}
var metadata: Logging.Logger.Metadata {
get {
self.state.withLockedValue {
$0.metadata
}
}
set {
self.state.withLockedValue {
$0.metadata = newValue
}
}
}
var logLevel: Logging.Logger.Level {
get {
self.state.withLockedValue {
$0.logLevel
}
}
set {
self.state.withLockedValue {
$0.logLevel = newValue
}
}
}
}
|