Skip to content

Commit 94d0876

Browse files
committed
Add convenience overloads for Logger & correct doc sample code
1 parent 7ba5dee commit 94d0876

File tree

4 files changed

+123
-6
lines changed

4 files changed

+123
-6
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ When using `Throwable` with the `Catching` protocol, you get powerful error chai
122122
do {
123123
try await updateUserProfile()
124124
} catch {
125-
Logger().error("\(ErrorKit.errorChainDescription(for: error))")
125+
print(ErrorKit.errorChainDescription(for: error))
126126

127127
// Output shows the complete error path:
128128
// ProfileError

Sources/ErrorKit/ErrorKit.docc/Guides/Error-Chain-Debugging.md

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,28 @@ ErrorKit enhances string interpolation for error chain debugging. Use either `ch
6969

7070
```swift
7171
// Instead of:
72-
Logger().error("Update failed: \(ErrorKit.errorChainDescription(for: error))")
72+
print("Update failed:\n\(ErrorKit.errorChainDescription(for: error))")
7373

7474
// You can simply use either:
75-
Logger().error("Update failed:\n\(chain: error)")
76-
Logger().error("Update failed:\n\(debug: error)")
75+
print("Update failed:\n\(chain: error)")
76+
print("Update failed:\n\(debug: error)")
7777
```
7878

7979
Use `\(error)` for user-facing messages, `\(chain: error)` or `\(debug: error)` for debugging.
8080

81+
For `OSLog`/`Logger` there are dedicated convenience overloads taking a second `error` parameter:
82+
83+
```swift
84+
// Instead of:
85+
Logger().error("Update failed:\n\(ErrorKit.errorChainDescription(for: error))")
86+
87+
// You can simply use overloads like:
88+
Logger().error("Update failed", error: error)
89+
Logger().warning("Update failed", error: error)
90+
```
91+
92+
There's no need to add a colon (`:`) or newline (`\n`) to the message, they will be added automatically.
93+
8194
### Error Analytics with Grouping IDs
8295

8396
To help prioritize which errors to fix, ErrorKit provides `groupingID(for:)` that generates stable identifiers for errors sharing the exact same type structure and enum cases:
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
#if canImport(OSLog)
2+
import OSLog
3+
4+
extension Logger {
5+
/// Logs a debug message with complete error chain description
6+
///
7+
/// ```swift
8+
/// Logger().debug("Operation failed", error: error)
9+
/// ```
10+
///
11+
/// - Parameters:
12+
/// - message: The main log message
13+
/// - error: The error to include using its complete chain description for debugging
14+
public func debug(_ message: String, error: some Error) {
15+
let normalizedMessage = self.normalizeMessage(message)
16+
self.debug("\(normalizedMessage):\n\(ErrorKit.errorChainDescription(for: error))")
17+
}
18+
19+
/// Logs an info message with complete error chain description
20+
///
21+
/// ```swift
22+
/// Logger().info("User action failed", error: error)
23+
/// ```
24+
///
25+
/// - Parameters:
26+
/// - message: The main log message
27+
/// - error: The error to include using its complete chain description for debugging
28+
public func info(_ message: String, error: some Error) {
29+
let normalizedMessage = self.normalizeMessage(message)
30+
self.info("\(normalizedMessage):\n\(ErrorKit.errorChainDescription(for: error))")
31+
}
32+
33+
/// Logs a notice with complete error chain description
34+
///
35+
/// ```swift
36+
/// Logger().notice("Important operation failed", error: error)
37+
/// ```
38+
///
39+
/// - Parameters:
40+
/// - message: The main log message
41+
/// - error: The error to include using its complete chain description for debugging
42+
public func notice(_ message: String, error: some Error) {
43+
let normalizedMessage = self.normalizeMessage(message)
44+
self.notice("\(normalizedMessage):\n\(ErrorKit.errorChainDescription(for: error))")
45+
}
46+
47+
/// Logs a warning with complete error chain description
48+
///
49+
/// ```swift
50+
/// Logger().warning("Recoverable error occurred", error: error)
51+
/// ```
52+
///
53+
/// - Parameters:
54+
/// - message: The main log message
55+
/// - error: The error to include using its complete chain description for debugging
56+
public func warning(_ message: String, error: some Error) {
57+
let normalizedMessage = self.normalizeMessage(message)
58+
self.warning("\(normalizedMessage):\n\(ErrorKit.errorChainDescription(for: error))")
59+
}
60+
61+
/// Logs an error message with complete error chain description
62+
///
63+
/// ```swift
64+
/// Logger().error("Upload failed", error: error)
65+
/// ```
66+
///
67+
/// - Parameters:
68+
/// - message: The main log message
69+
/// - error: The error to include using its complete chain description for debugging
70+
public func error(_ message: String, error: some Error) {
71+
let normalizedMessage = self.normalizeMessage(message)
72+
self.error("\(normalizedMessage):\n\(ErrorKit.errorChainDescription(for: error))")
73+
}
74+
75+
/// Logs a fault with complete error chain description
76+
///
77+
/// ```swift
78+
/// Logger().fault("Critical system error", error: error)
79+
/// ```
80+
///
81+
/// - Parameters:
82+
/// - message: The main log message
83+
/// - error: The error to include using its complete chain description for debugging
84+
public func fault(_ message: String, error: some Error) {
85+
let normalizedMessage = self.normalizeMessage(message)
86+
self.fault("\(normalizedMessage):\n\(ErrorKit.errorChainDescription(for: error))")
87+
}
88+
89+
/// Normalizes a log message by removing trailing punctuation and whitespace
90+
///
91+
/// This ensures consistent formatting regardless of how the user writes the message:
92+
/// - "Upload failed" → "Upload failed"
93+
/// - "Upload failed:" → "Upload failed"
94+
/// - "Upload failed: " → "Upload failed"
95+
/// - "Upload failed." → "Upload failed"
96+
///
97+
/// - Parameter message: The original message to normalize
98+
/// - Returns: The normalized message without trailing punctuation or whitespace
99+
private func normalizeMessage(_ message: String) -> String {
100+
return message.trimmingCharacters(in: .whitespacesAndNewlines)
101+
.trimmingCharacters(in: CharacterSet(charactersIn: ":"))
102+
}
103+
}
104+
#endif

Sources/ErrorKit/Helpers/String+ErrorKit.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ extension String.StringInterpolation {
3939
/// type information, and nested structure. Ideal for logging and debugging.
4040
///
4141
/// ```swift
42-
/// Logger().error("Operation failed with:\n\(chain: error)")
42+
/// print("Operation failed with:\n\(chain: error)")
4343
/// // Operation failed with:
4444
/// // DatabaseError
4545
/// // └─ FileError
@@ -58,7 +58,7 @@ extension String.StringInterpolation {
5858
/// type information, and nested structure. Ideal for logging and debugging.
5959
///
6060
/// ```swift
61-
/// Logger().error("Operation failed with:\n\(chain: error)")
61+
/// print("Operation failed with:\n\(chain: error)")
6262
/// // Operation failed with:
6363
/// // DatabaseError
6464
/// // └─ FileError

0 commit comments

Comments
 (0)