Created
April 7, 2021 13:53
-
-
Save kkebo/b8d2d10698d6a1f64ff60bbeaa7d7b93 to your computer and use it in GitHub Desktop.
PlaygroundHandler
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Logging | |
LoggingSystem.bootstrap { label in | |
var handler = PlaygroundHandler(label: label) | |
handler.logLevel = .trace | |
return handler | |
} | |
let logger = Logger(label: "hoge") | |
logger.debug("hoge") | |
logger.error("hogeeeeeeeee") | |
logger.critical("hoge") |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import Logging | |
public struct PlaygroundHandler { | |
private let label: String | |
private var prettyMetadata: String? | |
public var metadata = Logger.Metadata() { | |
didSet { | |
self.prettyMetadata = self.prettify(self.metadata) | |
} | |
} | |
public var logLevel = Logger.Level.info | |
public init(label: String) { | |
self.label = label | |
} | |
private func prettify(_ metadata: Logger.Metadata) -> String? { | |
!metadata.isEmpty | |
? metadata.lazy.sorted(by: { $0.key < $1.key }).map { "\($0)=\($1)" }.joined(separator: " ") | |
: nil | |
} | |
private func timestamp() -> String { | |
var buffer = [Int8](repeating: 0, count: 255) | |
var timestamp = time(nil) | |
let localTime = localtime(×tamp) | |
strftime(&buffer, buffer.count, "%Y-%m-%dT%H:%M:%S%z", localTime) | |
return buffer.withUnsafeBufferPointer { | |
$0.withMemoryRebound(to: CChar.self) { | |
String(cString: $0.baseAddress!) | |
} | |
} | |
} | |
} | |
extension PlaygroundHandler: LogHandler { | |
public func log(level: Logger.Level, message: Logger.Message, metadata: Logger.Metadata?, source: String, file: String, function: String, line: UInt) { | |
let prettyMetadata = metadata?.isEmpty ?? true | |
? self.prettyMetadata | |
: self.prettify(self.metadata.merging(metadata!, uniquingKeysWith: { _, new in new })) | |
print("\(self.timestamp()) \(level) \(self.label) :\(prettyMetadata.map { " \($0)" } ?? "") \(message)") | |
} | |
public subscript(metadataKey metadataKey: String) -> Logger.Metadata.Value? { | |
get { | |
return self.metadata[metadataKey] | |
} | |
set(newValue) { | |
self.metadata[metadataKey] = newValue | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment