Skip to content

Instantly share code, notes, and snippets.

@jnewc
Last active February 22, 2017 20:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jnewc/f43fd5efa654d97465e12adb9a4f3734 to your computer and use it in GitHub Desktop.
Save jnewc/f43fd5efa654d97465e12adb9a4f3734 to your computer and use it in GitHub Desktop.
Class-based logger as a protocol extension
import Foundation
import Rainbow
public enum LogLevel: UInt {
case none = 0b0000
case debug = 0b0001
case info = 0b0011
case warn = 0b0111
case error = 0b1111
}
fileprivate var LoggerCache: [String: Logger] = [:]
public protocol LogReporter {}
public extension LogReporter {
var logger: Logger {
let className = String(describing: type(of: self))
if(!LoggerCache.keys.contains(className)) {
LoggerCache[className] = PrintLogger()
}
return LoggerCache[className]!
}
func logger<T: Logger>(with type: T) -> Logger {
let className = String(describing: type(of: self))
if(!LoggerCache.keys.contains(className)) {
LoggerCache[className] = T.init()
}
return LoggerCache[className]!
}
}
public protocol Logger: class {
init()
var logLevel: LogLevel { set get }
func debug(_ messages: String ...)
func log(_ messages: String...)
func warn(_ messages: String...)
func error(_ messages: String...)
}
fileprivate class PrintLogger: Logger {
public var logLevel = LogLevel.info
public required init() {
}
fileprivate func printLine(_ line: String, _ color: Color) {
print("\(line)".applyingColor(color))
}
private func enabled(_ expected: LogLevel) -> Bool {
return (logLevel.rawValue & expected.rawValue) > 0
}
public func debug(_ messages: String...) {
guard enabled(.debug) else { return }
messages.forEach {
self.printLine($0, .white)
}
}
public func log(_ messages: String...) {
guard enabled(.info) else { return }
messages.forEach {
self.printLine($0, .white)
}
}
public func warn(_ messages: String...) {
guard enabled(.warn) else { return }
messages.forEach {
self.printLine($0, .yellow)
}
}
public func error(_ messages: String...) {
guard enabled(.error) else { return }
messages.forEach {
self.printLine($0, .red)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment