From 81f5246441cd92f0ea1eb255e928c99667ffb40e Mon Sep 17 00:00:00 2001 From: Steve Date: Fri, 19 Jun 2026 13:06:57 +0100 Subject: [PATCH 1/3] chore: update swift-log lockfile --- Package.resolved | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.resolved b/Package.resolved index 1394a26a9..06d6ed316 100644 --- a/Package.resolved +++ b/Package.resolved @@ -177,8 +177,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/apple/swift-log.git", "state" : { - "revision" : "bbd81b6725ae874c69e9b8c8804d462356b55523", - "version" : "1.10.1" + "revision" : "92448c359f00ebe36ae97d3bd9086f13c7692b5a", + "version" : "1.13.2" } }, { From b1d6fa37eb7d14bfb8a02230fe20e41104ad2bab Mon Sep 17 00:00:00 2001 From: Steve Date: Fri, 19 Jun 2026 13:07:05 +0100 Subject: [PATCH 2/3] fix(logs): implement SwiftLog event handlers --- Sources/ContainerLog/FileLogHandler.swift | 20 ++++++++++++++++++++ Sources/ContainerLog/OSLogHandler.swift | 20 ++++++++++++++++++++ Sources/ContainerLog/StderrLogHandler.swift | 20 ++++++++++++++++++++ 3 files changed, 60 insertions(+) diff --git a/Sources/ContainerLog/FileLogHandler.swift b/Sources/ContainerLog/FileLogHandler.swift index 446fa3308..e708a9a99 100644 --- a/Sources/ContainerLog/FileLogHandler.swift +++ b/Sources/ContainerLog/FileLogHandler.swift @@ -60,6 +60,14 @@ public struct FileLogHandler: LogHandler { self.fileHandle.seekToEndOfFile() } + public func log(event: LogEvent) { + self.emit( + level: event.level, + message: event.message, + metadata: event.metadata + ) + } + public func log( level: Logger.Level, message: Logger.Message, @@ -68,6 +76,18 @@ public struct FileLogHandler: LogHandler { file: String, function: String, line: UInt + ) { + self.emit( + level: level, + message: message, + metadata: metadata + ) + } + + private func emit( + level: Logger.Level, + message: Logger.Message, + metadata: Logger.Metadata? ) { let timestampFormatter: ISO8601DateFormatter = { let formatter = ISO8601DateFormatter() diff --git a/Sources/ContainerLog/OSLogHandler.swift b/Sources/ContainerLog/OSLogHandler.swift index 227e35e03..842279704 100644 --- a/Sources/ContainerLog/OSLogHandler.swift +++ b/Sources/ContainerLog/OSLogHandler.swift @@ -47,6 +47,14 @@ public struct OSLogHandler: LogHandler { } extension OSLogHandler { + public func log(event: LogEvent) { + self.emit( + level: event.level, + message: event.message, + metadata: event.metadata + ) + } + public func log( level: Logger.Level, message: Logger.Message, @@ -55,6 +63,18 @@ extension OSLogHandler { file: String, function: String, line: UInt + ) { + self.emit( + level: level, + message: message, + metadata: metadata + ) + } + + private func emit( + level: Logger.Level, + message: Logger.Message, + metadata: Logger.Metadata? ) { var formattedMetadata = self.formattedMetadata if let metadataOverride = metadata, !metadataOverride.isEmpty { diff --git a/Sources/ContainerLog/StderrLogHandler.swift b/Sources/ContainerLog/StderrLogHandler.swift index ffcd9179e..1011ba8bf 100644 --- a/Sources/ContainerLog/StderrLogHandler.swift +++ b/Sources/ContainerLog/StderrLogHandler.swift @@ -34,6 +34,14 @@ public struct StderrLogHandler: LogHandler { public init() {} + public func log(event: LogEvent) { + self.emit( + level: event.level, + message: event.message, + metadata: event.metadata + ) + } + public func log( level: Logger.Level, message: Logger.Message, @@ -42,6 +50,18 @@ public struct StderrLogHandler: LogHandler { file: String, function: String, line: UInt + ) { + self.emit( + level: level, + message: message, + metadata: metadata + ) + } + + private func emit( + level: Logger.Level, + message: Logger.Message, + metadata: Logger.Metadata? ) { let data: Data switch logLevel { From 6355f13b3536eb91d8f334b84731deac9fc7c071 Mon Sep 17 00:00:00 2001 From: Steve Date: Sat, 11 Jul 2026 17:46:21 +0100 Subject: [PATCH 3/3] test(logs): cover SwiftLog event handlers --- Package.swift | 8 +++ .../ContainerLogHandlerTests.swift | 61 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 Tests/ContainerLogTests/ContainerLogHandlerTests.swift diff --git a/Package.swift b/Package.swift index b00e58894..9fdf6a560 100644 --- a/Package.swift +++ b/Package.swift @@ -431,6 +431,14 @@ let package = Package( .product(name: "SystemPackage", package: "swift-system"), ] ), + .testTarget( + name: "ContainerLogTests", + dependencies: [ + .product(name: "Logging", package: "swift-log"), + .product(name: "SystemPackage", package: "swift-system"), + "ContainerLog", + ] + ), .target( name: "ContainerPersistence", dependencies: [ diff --git a/Tests/ContainerLogTests/ContainerLogHandlerTests.swift b/Tests/ContainerLogTests/ContainerLogHandlerTests.swift new file mode 100644 index 000000000..f62b0465b --- /dev/null +++ b/Tests/ContainerLogTests/ContainerLogHandlerTests.swift @@ -0,0 +1,61 @@ +//===----------------------------------------------------------------------===// +// Copyright 2026 Apple Inc. and the container project authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//===----------------------------------------------------------------------===// + +import Foundation +import Logging +import SystemPackage +import Testing + +@testable import ContainerLog + +@Suite +struct ContainerLogHandlerTests { + @Test + func handlersAcceptPrimaryLogEvent() throws { + let directory = FileManager.default.temporaryDirectory + .appendingPathComponent("container-log-tests-\(UUID().uuidString)", isDirectory: true) + defer { try? FileManager.default.removeItem(at: directory) } + + let url = directory.appendingPathComponent("events.log") + var fileHandler = try FileLogHandler( + label: "container-log-tests", + category: "events", + path: FilePath(url.path) + ) + fileHandler.metadata = ["scope": "handler"] + + let event = LogEvent( + level: .warning, + message: "primary event", + metadata: ["scope": "event", "request": "123"], + source: "ContainerLogTests", + file: #fileID, + function: #function, + line: #line + ) + + fileHandler.log(event: event) + StderrLogHandler().log(event: event) + OSLogHandler(label: "container-log-tests", category: "events").log(event: event) + + let output = try String(contentsOf: url, encoding: .utf8) + #expect(output.contains("[warning] container-log-tests events")) + #expect(output.contains("primary event")) + #expect(output.contains("event")) + #expect(output.contains("123")) + #expect(!output.contains("handler")) + } +}