17
17
///
18
18
/// - Note: This will only split along newline boundary. If a single line is longer than `maxChunkSize`, it won't be
19
19
/// split. This is fine for compiler argument splitting since a single argument is rarely longer than 800 characters.
20
- package func splitLongMultilineMessage( message: String , maxChunkSize: Int = 800 ) -> [ String ] {
20
+ package func splitLongMultilineMessage( message: String ) -> [ String ] {
21
+ let maxChunkSize = 800
21
22
var chunks : [ String ] = [ ]
22
23
for line in message. split ( separator: " \n " , omittingEmptySubsequences: false ) {
23
24
if let lastChunk = chunks. last, lastChunk. utf8. count + line. utf8. count < maxChunkSize {
@@ -34,3 +35,34 @@ package func splitLongMultilineMessage(message: String, maxChunkSize: Int = 800)
34
35
}
35
36
return chunks
36
37
}
38
+
39
+ extension Logger {
40
+ /// Implementation detail of `logFullObjectInMultipleLogMessages`
41
+ private struct LoggableChunk : CustomLogStringConvertible {
42
+ var description : String
43
+ var redactedDescription : String
44
+ }
45
+
46
+ package func logFullObjectInMultipleLogMessages(
47
+ level: LogLevel = . default,
48
+ header: StaticString ,
49
+ _ subject: some CustomLogStringConvertible
50
+ ) {
51
+ let chunks = splitLongMultilineMessage ( message: subject. description)
52
+ let redactedChunks = splitLongMultilineMessage ( message: subject. redactedDescription)
53
+ let maxChunkCount = max ( chunks. count, redactedChunks. count)
54
+ for i in 0 ..< maxChunkCount {
55
+ let loggableChunk = LoggableChunk (
56
+ description: i < chunks. count ? chunks [ i] : " " ,
57
+ redactedDescription: i < redactedChunks. count ? redactedChunks [ i] : " "
58
+ )
59
+ self . log (
60
+ level: level,
61
+ """
62
+ \( header, privacy: . public) ( \( i + 1 ) / \( maxChunkCount) )
63
+ \( loggableChunk. forLogging)
64
+ """
65
+ )
66
+ }
67
+ }
68
+ }
0 commit comments