From 7863e4307923f8a825f38b98f08513a1e0efd385 Mon Sep 17 00:00:00 2001 From: Tamilarasan Raja Date: Sun, 28 Jun 2026 03:54:50 +0530 Subject: [PATCH] ContainerLog: add metadataProvider to LogHandler implementations --- Sources/ContainerLog/FileLogHandler.swift | 5 ++++- Sources/ContainerLog/OSLogHandler.swift | 21 ++++++++------------- Sources/ContainerLog/StderrLogHandler.swift | 17 +++++++++++++---- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/Sources/ContainerLog/FileLogHandler.swift b/Sources/ContainerLog/FileLogHandler.swift index 446fa3308..5aa7d318c 100644 --- a/Sources/ContainerLog/FileLogHandler.swift +++ b/Sources/ContainerLog/FileLogHandler.swift @@ -23,6 +23,7 @@ import SystemPackage public struct FileLogHandler: LogHandler { public var logLevel: Logger.Level = .info public var metadata: Logger.Metadata = [:] + public var metadataProvider: Logger.MetadataProvider? private let label: String private let category: String @@ -76,8 +77,10 @@ public struct FileLogHandler: LogHandler { }() let timestamp = timestampFormatter.string(from: Date()) - // Merge logger-level metadata with per-message metadata var effectiveMetadata = self.metadata + if let provided = self.metadataProvider?.get(), !provided.isEmpty { + effectiveMetadata.merge(provided) { _, new in new } + } if let metadata { effectiveMetadata.merge(metadata) { _, new in new } } diff --git a/Sources/ContainerLog/OSLogHandler.swift b/Sources/ContainerLog/OSLogHandler.swift index 227e35e03..2e8cfe11d 100644 --- a/Sources/ContainerLog/OSLogHandler.swift +++ b/Sources/ContainerLog/OSLogHandler.swift @@ -24,13 +24,8 @@ public struct OSLogHandler: LogHandler { private let logger: os.Logger public var logLevel: Logger.Level = .info - private var formattedMetadata: String? - - public var metadata = Logger.Metadata() { - didSet { - self.formattedMetadata = self.formatMetadata(self.metadata) - } - } + public var metadataProvider: Logger.MetadataProvider? + public var metadata = Logger.Metadata() public subscript(metadataKey metadataKey: String) -> Logger.Metadata.Value? { get { @@ -56,14 +51,14 @@ extension OSLogHandler { function: String, line: UInt ) { - var formattedMetadata = self.formattedMetadata + var effectiveMetadata = self.metadata + if let provided = self.metadataProvider?.get(), !provided.isEmpty { + effectiveMetadata.merge(provided) { _, new in new } + } if let metadataOverride = metadata, !metadataOverride.isEmpty { - formattedMetadata = self.formatMetadata( - self.metadata.merging(metadataOverride) { - $1 - } - ) + effectiveMetadata.merge(metadataOverride) { _, new in new } } + let formattedMetadata = self.formatMetadata(effectiveMetadata) var finalMessage = message.description if let formattedMetadata { diff --git a/Sources/ContainerLog/StderrLogHandler.swift b/Sources/ContainerLog/StderrLogHandler.swift index ffcd9179e..7dbbfe8d6 100644 --- a/Sources/ContainerLog/StderrLogHandler.swift +++ b/Sources/ContainerLog/StderrLogHandler.swift @@ -22,6 +22,7 @@ import Logging public struct StderrLogHandler: LogHandler { public var logLevel: Logger.Level = .info public var metadata: Logger.Metadata = [:] + public var metadataProvider: Logger.MetadataProvider? public subscript(metadataKey metadataKey: String) -> Logger.Metadata.Value? { get { @@ -43,13 +44,21 @@ public struct StderrLogHandler: LogHandler { function: String, line: UInt ) { + var effectiveMetadata = self.metadata + if let provided = self.metadataProvider?.get(), !provided.isEmpty { + effectiveMetadata.merge(provided) { _, new in new } + } + if let metadata, !metadata.isEmpty { + effectiveMetadata.merge(metadata) { _, new in new } + } + let data: Data switch logLevel { case .debug, .trace: let timestamp = isoTimestamp() - if let metadata, !metadata.isEmpty { + if !effectiveMetadata.isEmpty { data = - "\(timestamp) \(message.description): \(metadata.description)\n" + "\(timestamp) \(message.description): \(effectiveMetadata.description)\n" .data(using: .utf8) ?? Data() } else { data = @@ -57,9 +66,9 @@ public struct StderrLogHandler: LogHandler { .data(using: .utf8) ?? Data() } default: - if let metadata, !metadata.isEmpty { + if !effectiveMetadata.isEmpty { data = - "\(message.description): \(metadata.description)\n" + "\(message.description): \(effectiveMetadata.description)\n" .data(using: .utf8) ?? Data() } else { data =