Skip to content

Instantly share code, notes, and snippets.

@AvdLee
Last active March 7, 2017 08:44
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 AvdLee/8c70081642bea165bef03122ad32027d to your computer and use it in GitHub Desktop.
Save AvdLee/8c70081642bea165bef03122ad32027d to your computer and use it in GitHub Desktop.
//
// 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