Last active
March 7, 2017 08:44
-
-
Save AvdLee/8c70081642bea165bef03122ad32027d to your computer and use it in GitHub Desktop.
This file contains 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
// | |
// ALLogger.swift | |
// | |
// Created by Antoine van der Lee on 21/06/16. | |
// Copyright © 2016 Antoine van der Lee. All rights reserved. | |
// | |
import Foundation | |
import UIKit | |
public typealias DDLogLevel = ALLogLevel | |
public typealias DDASLLogger = ALASLLogger | |
public func DDLogVerbose(_ logText: @autoclosure () -> String, level: ALLogLevel? = nil){ | |
ALLogger.logVerbose(logText, level: level ?? .verbose) | |
} | |
public func DDLogInfo(_ logText: @autoclosure () -> String, level: ALLogLevel? = nil){ | |
ALLogger.logInfo(logText, level: level ?? .verbose) | |
} | |
public func DDLogDebug(_ logText: @autoclosure () -> String, level: ALLogLevel? = nil){ | |
ALLogger.logDebug(logText, level: level ?? .verbose) | |
} | |
public func DDLogWarn(_ logText: @autoclosure () -> String, level: ALLogLevel? = nil){ | |
ALLogger.logWarn(logText, level: level ?? .verbose) | |
} | |
public func DDLogError(_ logText: @autoclosure () -> String, level: ALLogLevel? = nil){ | |
ALLogger.logError(logText, level: level ?? .verbose) | |
} | |
public enum ALLogLevel : Int { | |
case verbose = 0 | |
case info = 1 | |
case debug = 2 | |
case warning = 3 | |
case error = 4 | |
} | |
extension ALLogLevel : Equatable { } | |
public func ==(lhs:ALLogLevel, rhs:ALLogLevel) -> Bool { | |
return lhs.rawValue == rhs.rawValue | |
} | |
public func <=(lhs:ALLogLevel, rhs:ALLogLevel) -> Bool { | |
return lhs.rawValue >= rhs.rawValue | |
} | |
public func >=(lhs:ALLogLevel, rhs:ALLogLevel) -> Bool { | |
return lhs.rawValue <= rhs.rawValue | |
} | |
public struct ALLogMessage { | |
let message: String | |
let level: ALLogLevel | |
} | |
public final class ALLogger { | |
public static let sharedInstance = ALLogger() | |
private lazy var abstractLoggers = [ALAbstractLogger]() | |
private static let defaultDebugLevel = ALLogLevel.verbose | |
public func addLogger(_ logger:ALAbstractLogger){ | |
abstractLoggers.append(logger) | |
} | |
static func logVerbose(_ logText: @autoclosure () -> String, level: ALLogLevel = defaultDebugLevel){ | |
guard ALLogLevel.verbose <= level else { return } | |
log(logText, level: level) | |
} | |
static func logInfo(_ logText: @autoclosure () -> String, level: ALLogLevel = defaultDebugLevel){ | |
guard ALLogLevel.info <= level else { return } | |
log(logText, level: level) | |
} | |
static func logDebug(_ logText: @autoclosure () -> String, level: ALLogLevel = defaultDebugLevel){ | |
guard ALLogLevel.debug <= level else { return } | |
log(logText, level: level) | |
} | |
static func logWarn(_ logText: @autoclosure () -> String, level: ALLogLevel = defaultDebugLevel){ | |
guard ALLogLevel.warning <= level else { return } | |
log(logText, level: level) | |
} | |
static func logError(_ logText: @autoclosure () -> String, level: ALLogLevel = defaultDebugLevel){ | |
guard ALLogLevel.error <= level else { return } | |
log(logText, level: level) | |
} | |
private static func log(_ logText: @autoclosure () -> String, level: ALLogLevel = defaultDebugLevel){ | |
let message = ALLogMessage(message: logText(), level: level) | |
sharedInstance.abstractLoggers.forEach { $0.logMessage(message) } | |
} | |
} | |
public protocol ALAbstractLogger { | |
func logMessage(_ logMessage: ALLogMessage) | |
} | |
/** | |
* This class provides a logger for the Apple System Log facility. | |
* | |
* As described in the "Getting Started" page, | |
* the traditional NSLog() function directs its output to two places: | |
* | |
* - Apple System Log | |
* - StdErr (if stderr is a TTY) so log statements show up in Xcode console | |
* | |
* To duplicate NSLog() functionality you can simply add this logger and a tty logger. | |
* However, if you instead choose to use file logging (for faster performance), | |
* you may choose to use a file logger and a tty logger. | |
**/ | |
public final class ALASLLogger : ALAbstractLogger { | |
public var colorsEnabled:Bool = false | |
public init(){} | |
public func logMessage(_ logMessage: ALLogMessage){ | |
if colorsEnabled { | |
ColorLog.log(logMessage.message, withColor: logMessage.level.colorValue.cgColor) | |
} else { | |
print("|>>> \(logMessage.message)") | |
} | |
} | |
} | |
private struct ColorLog { | |
static let ESCAPE = "\u{001b}[" | |
static let RESET_FG = ESCAPE + "fg;" // Clear any foreground color | |
static let RESET_BG = ESCAPE + "bg;" // Clear any background color | |
static let RESET = ESCAPE + ";" // Clear any foreground or background color | |
static func log<T>(_ object: T, withColor color:CGColor){ | |
let components = color.components | |
let red = (components?[0])! * 255 | |
let green = (components?[1])! * 255 | |
let blue = (components?[2])! * 255 | |
let printString = String(format: "\(ESCAPE)fg%.0f,%.0f,%.0f;\(object)\(RESET)", red, green, blue) | |
print(printString) | |
} | |
} | |
private extension ALLogLevel { | |
var colorValue:UIColor { | |
switch self { | |
case .info: | |
return UIColor.blue | |
case .warning: | |
return UIColor.orange | |
case .error: | |
return UIColor.red | |
default: | |
return UIColor.black | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment