Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,14 @@ public let benchmarks: @Sendable () -> Void = {
makeBenchmark(loggerLevel: .warning, logLevel: .warning, "_generic") { logger in
logger.log(level: .warning, "hello, benchmarking world")
}
makeBenchmark(loggerLevel: .notice, logLevel: .notice, "_attributed_generic") { logger in
logger.log(
level: .notice,
"hello, benchmarking world",
metadata: [
"public-key": "\("public-value", sensitivity: .public)",
"private-key": "\("private-value", sensitivity: .sensitive)",
]
)
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"instructions" : 619,
"instructions" : 622,
"objectAllocCount" : 0
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"instructions" : 619,
"objectAllocCount" : 0
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"instructions" : 1651,
"instructions" : 1669,
"objectAllocCount" : 0
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"instructions" : 1651,
"instructions" : 1669,
"objectAllocCount" : 0
}
36 changes: 36 additions & 0 deletions Benchmarks/NoTraits/Benchmarks/NoTraitsBenchmarks/NoTraits.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,40 @@ public let benchmarks: @Sendable () -> Void = {
makeBenchmark(loggerLevel: .error, logLevel: .debug, "_generic") { logger in
logger.log(level: .debug, "hello, benchmarking world")
}
makeBenchmark(loggerLevel: .error, logLevel: .error, "_1_attribute") { logger in
logger.log(
level: .error,
"hello, benchmarking world",
metadata: [
"public-key": "\("public-value", sensitivity: .public)"
]
)
}
makeBenchmark(loggerLevel: .error, logLevel: .debug, "_1_attribute") { logger in
logger.log(
level: .debug,
"hello, benchmarking world",
metadata: [
"public-key": "\("public-value", sensitivity: .public)"
]
)
}
makeBenchmark(loggerLevel: .error, logLevel: .error, "_2_attributes") { logger in
logger.log(
level: .error,
"hello, benchmarking world",
metadata: [
"public-key": "\("public-value", attributes: [BenchmarkSensitivity.public, BenchmarkColor.red])"
]
)
}
makeBenchmark(loggerLevel: .error, logLevel: .debug, "_2_attributes") { logger in
logger.log(
level: .debug,
"hello, benchmarking world",
metadata: [
"public-key": "\("public-value", attributes: [BenchmarkSensitivity.public, BenchmarkColor.red])"
]
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"instructions" : 985,
"objectAllocCount" : 0
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"instructions" : 985,
"objectAllocCount" : 0
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"instructions" : 984,
"instructions" : 981,
"objectAllocCount" : 0
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"instructions" : 5443,
"objectAllocCount" : 2
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"instructions" : 6599,
"objectAllocCount" : 3
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"instructions" : 1368,
"instructions" : 1386,
"objectAllocCount" : 0
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"instructions" : 897,
"objectAllocCount" : 0
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"instructions" : 897,
"objectAllocCount" : 0
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"instructions" : 893,
"instructions" : 896,
"objectAllocCount" : 0
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"instructions" : 5339,
"objectAllocCount" : 2
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"instructions" : 6515,
"objectAllocCount" : 3
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"instructions" : 1649,
"instructions" : 1667,
"objectAllocCount" : 0
}
48 changes: 48 additions & 0 deletions Benchmarks/Sources/BenchmarksFactory/NoOpLogHandler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,40 @@

import Logging

// MARK: - Benchmark attributes

public enum BenchmarkSensitivity: Int64, Logger.MetadataAttributeKey, Sendable {
case sensitive = 1
case `public` = 2
}

extension Logger.MetadataValue.StringInterpolation {
@inlinable
public mutating func appendInterpolation<T: CustomStringConvertible & Sendable>(
_ value: T,
sensitivity: BenchmarkSensitivity
) {
self.appendInterpolation(value, attributes: { $0[BenchmarkSensitivity.self] = sensitivity })
}
}

public enum BenchmarkColor: Int64, Logger.MetadataAttributeKey, Sendable {
case red = 1
case blue = 2
}

extension Logger.MetadataValue.StringInterpolation {
@inlinable
public mutating func appendInterpolation<T: CustomStringConvertible & Sendable>(
_ value: T,
color: BenchmarkColor
) {
self.appendInterpolation(value, attributes: { $0[BenchmarkColor.self] = color })
}
}

// MARK: - NoOpLogHandler

struct NoOpLogHandler: LogHandler {
let label: String
public var metadataProvider: Logger.MetadataProvider?
Expand All @@ -31,6 +65,13 @@ struct NoOpLogHandler: LogHandler {
func log(
event: LogEvent
) {
// Access metadata attributes
if let metadata = event.metadata {
for (_, value) in metadata {
let _ = value.attributes
}
}

// Do nothing
}

Expand All @@ -43,6 +84,13 @@ struct NoOpLogHandler: LogHandler {
function: String,
line: UInt
) {
// Access metadata attributes
if let metadata = explicitMetadata {
for (_, value) in metadata {
let _ = value.attributes
}
}

// Do nothing
}

Expand Down
18 changes: 18 additions & 0 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ let package = Package(
name: "swift-log",
products: [
.library(name: "Logging", targets: ["Logging"]),
.library(name: "LoggingAttributes", targets: ["LoggingAttributes"]),
.library(name: "InMemoryLogging", targets: ["InMemoryLogging"]),
.library(name: "OSLogHandler", targets: ["OSLogHandler"]),
],
traits: [
.trait(name: "MaxLogLevelDebug", description: "Debug and above available (compiles out trace)"),
Expand All @@ -31,18 +33,34 @@ let package = Package(
name: "Logging",
dependencies: []
),
.target(
name: "LoggingAttributes",
dependencies: ["Logging"]
),
.target(
name: "InMemoryLogging",
dependencies: ["Logging"]
),
.target(
name: "OSLogHandler",
dependencies: ["Logging", "LoggingAttributes"]
),
.testTarget(
name: "LoggingTests",
dependencies: ["Logging"]
),
.testTarget(
name: "LoggingAttributesTests",
dependencies: ["LoggingAttributes", "Logging"]
),
.testTarget(
name: "InMemoryLoggingTests",
dependencies: ["InMemoryLogging", "Logging"]
),
.testTarget(
name: "OSLogHandlerTests",
dependencies: ["OSLogHandler", "Logging", "LoggingAttributes"]
),
]
)

Expand Down
18 changes: 18 additions & 0 deletions Package@swift-6.1.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ let package = Package(
name: "swift-log",
products: [
.library(name: "Logging", targets: ["Logging"]),
.library(name: "LoggingAttributes", targets: ["LoggingAttributes"]),
.library(name: "InMemoryLogging", targets: ["InMemoryLogging"]),
.library(name: "OSLogHandler", targets: ["OSLogHandler"]),
],
traits: [
.trait(name: "MaxLogLevelDebug", description: "Debug and above available (compiles out trace)"),
Expand All @@ -31,18 +33,34 @@ let package = Package(
name: "Logging",
dependencies: []
),
.target(
name: "LoggingAttributes",
dependencies: ["Logging"]
),
.target(
name: "InMemoryLogging",
dependencies: ["Logging"]
),
.target(
name: "OSLogHandler",
dependencies: ["Logging", "LoggingAttributes"]
),
.testTarget(
name: "LoggingTests",
dependencies: ["Logging"]
),
.testTarget(
name: "LoggingAttributesTests",
dependencies: ["LoggingAttributes", "Logging"]
),
.testTarget(
name: "InMemoryLoggingTests",
dependencies: ["InMemoryLogging", "Logging"]
),
.testTarget(
name: "OSLogHandlerTests",
dependencies: ["OSLogHandler", "Logging", "LoggingAttributes"]
),
]
)

Expand Down
36 changes: 25 additions & 11 deletions Sources/InMemoryLogging/InMemoryLogHandler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -57,18 +57,23 @@ public struct InMemoryLogHandler: LogHandler {
self.metadata = metadata
}

public init(level: Logger.Level, message: Logger.Message, error: (any Error)?, metadata: Logger.Metadata) {
public init(
level: Logger.Level,
message: Logger.Message,
error: (any Error)?,
metadata: Logger.Metadata
) {
self.level = level
self.message = message
self.error = error
self.metadata = metadata
}

public static func == (lhs: InMemoryLogHandler.Entry, rhs: InMemoryLogHandler.Entry) -> Bool {
public static func == (lhs: Entry, rhs: Entry) -> Bool {
lhs.level == rhs.level
&& lhs.message == rhs.message
&& errorsEqual(lhs.error, rhs.error)
&& lhs.metadata == rhs.metadata
&& errorsEqual(lhs.error, rhs.error)
}

private static func errorsEqual(_ lhs: (any Error)?, _ rhs: (any Error)?) -> Bool {
Expand Down Expand Up @@ -126,14 +131,23 @@ public struct InMemoryLogHandler: LogHandler {
}

public func log(event: LogEvent) {
// Start with the metadata provider..
var mergedMetadata: Logger.Metadata = self.metadataProvider?.get() ?? [:]
// ..merge in self.metadata, overwriting existing keys
mergedMetadata = mergedMetadata.merging(self.metadata) { $1 }
// ..merge in metadata from this log call, overwriting existing keys
mergedMetadata = mergedMetadata.merging(event.metadata ?? [:]) { $1 }

self.logStore.append(level: event.level, message: event.message, error: event.error, metadata: mergedMetadata)
var merged = self.metadata

if let provider = self.metadataProvider {
let provided = provider.get()
merged.merge(provided, uniquingKeysWith: { _, rhs in rhs })
}

if let eventMetadata = event.metadata {
merged.merge(eventMetadata, uniquingKeysWith: { _, rhs in rhs })
}

self.logStore.append(
level: event.level,
message: event.message,
error: event.error,
metadata: merged
)
}

@available(*, deprecated, renamed: "log(event:)")
Expand Down
Loading
Loading