@@ -39,14 +39,17 @@ public struct JSONLogger : LogHandler {
3939
4040 public static let defaultJSONEncoder : JSONEncoder = {
4141 let res = JSONEncoder ( )
42+ #if swift(>=5.3)
4243 res. outputFormatting = [ . withoutEscapingSlashes]
44+ #endif
4345 res. keyEncodingStrategy = . useDefaultKeys
4446 res. dateEncodingStrategy = . iso8601
4547 res. dataEncodingStrategy = . base64
4648 res. nonConformingFloatEncodingStrategy = . convertToString( positiveInfinity: " +inf " , negativeInfinity: " -inf " , nan: " nan " )
4749 return res
4850 } ( )
4951
52+ #if swift(>=5.7)
5053 public static let defaultJSONCodersForStringConvertibles : ( JSONEncoder , JSONDecoder ) = {
5154 let encoder = JSONEncoder ( )
5255 encoder. outputFormatting = [ . withoutEscapingSlashes]
@@ -72,6 +75,7 @@ public struct JSONLogger : LogHandler {
7275 decoder. nonConformingFloatDecodingStrategy = . throw
7376 return ( encoder, decoder)
7477 } ( )
78+ #endif
7579
7680 public var logLevel : Logger . Level = . info
7781
@@ -88,11 +92,14 @@ public struct JSONLogger : LogHandler {
8892 public let suffix : Data
8993
9094 public let jsonEncoder : JSONEncoder
95+ #if swift(>=5.7)
9196 /**
9297 If non-`nil`, the `Encodable` stringConvertible properties in the metadata will be encoded as `JSON` using the `JSONEncoder` and `JSONDecoder`.
9398 If the encoding fails or this property is set to `nil` the String value will be used. */
9499 public let jsonCodersForStringConvertibles : ( JSONEncoder , JSONDecoder ) ?
100+ #endif
95101
102+ #if swift(>=5.7)
96103 public static func forJSONSeq(
97104 on fh: FileHandle = . standardOutput,
98105 label: String ,
@@ -129,6 +136,41 @@ public struct JSONLogger : LogHandler {
129136 self . metadataProvider = metadataProvider
130137 }
131138
139+ #else
140+
141+ public static func forJSONSeq(
142+ on fh: FileHandle = . standardOutput,
143+ label: String ,
144+ jsonEncoder: JSONEncoder = Self . defaultJSONEncoder,
145+ metadataProvider: Logger . MetadataProvider ? = LoggingSystem . metadataProvider
146+ ) -> Self {
147+ return Self (
148+ label: label,
149+ fileHandle: fh,
150+ lineSeparator: Data ( ) , prefix: Data ( [ 0x1e ] ) , suffix: Data ( [ 0x0a ] ) ,
151+ jsonEncoder: jsonEncoder,
152+ metadataProvider: metadataProvider
153+ )
154+ }
155+
156+ public init (
157+ label: String ,
158+ fileHandle: FileHandle = . standardOutput,
159+ lineSeparator: Data = Data ( ) , prefix: Data = Data ( ) , suffix: Data = Data ( " \n " . utf8) ,
160+ jsonEncoder: JSONEncoder = Self . defaultJSONEncoder,
161+ metadataProvider: Logger . MetadataProvider ? = LoggingSystem . metadataProvider
162+ ) {
163+ self . label = label
164+ self . outputFileHandle = fileHandle
165+ self . lineSeparator = lineSeparator
166+ self . prefix = prefix
167+ self . suffix = suffix
168+ self . jsonEncoder = jsonEncoder
169+
170+ self . metadataProvider = metadataProvider
171+ }
172+ #endif
173+
132174 public subscript( metadataKey metadataKey: String ) -> Logger . Metadata . Value ? {
133175 get { metadata [ metadataKey] }
134176 set { metadata [ metadataKey] = newValue}
@@ -206,7 +248,7 @@ extension JSONLogger {
206248 Merge the logger’s metadata, the provider’s metadata and the given explicit metadata and return the new metadata.
207249 If the provider’s metadata and the explicit metadata are `nil`, returns `nil` to signify the current `jsonMetadataCache` can be used. */
208250 private func mergedMetadata( with explicit: Logger . Metadata ? ) -> Logger . Metadata ? {
209- var metadata = metadata
251+ var metadata = self . metadata
210252 let provided = metadataProvider? . get ( ) ?? [ : ]
211253
212254 guard !provided. isEmpty || !( ( explicit ?? [ : ] ) . isEmpty) else {
@@ -233,6 +275,8 @@ extension JSONLogger {
233275 case let . array( array) : return . array ( array . map ( jsonMetadataValue ( _: ) ) )
234276 case let . dictionary( dictionary) : return . object( dictionary. mapValues ( jsonMetadataValue ( _: ) ) )
235277 case let . stringConvertible( s) :
278+ /* Swift 5.7 and more. */
279+ #if swift(>=5.7)
236280 if let ( encoder, decoder) = jsonCodersForStringConvertibles,
237281 let c = s as? any Encodable ,
238282 let data = try ? encoder. encode ( c) ,
@@ -242,6 +286,9 @@ extension JSONLogger {
242286 } else {
243287 return . string( s. description)
244288 }
289+ #else
290+ return . string( s. description)
291+ #endif
245292 }
246293
247294 }
0 commit comments