Skip to content

Instantly share code, notes, and snippets.

@kkebo
Created April 7, 2021 13:53
Show Gist options
  • Save kkebo/b8d2d10698d6a1f64ff60bbeaa7d7b93 to your computer and use it in GitHub Desktop.
Save kkebo/b8d2d10698d6a1f64ff60bbeaa7d7b93 to your computer and use it in GitHub Desktop.
PlaygroundHandler
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")
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(&timestamp)
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