     public enum ErrorLoggingPolicy {
         case singleEvent
         case multipleEvents
+    }
+    
+    internal enum LogType {
+        case debug
+        case warning
+        case verbose
+        case error
+        case info
     }
     
     public var logTypeKey = "log_type"

        let file = String(describing: file)
        let function = String(describing: function)
        let updatedUserInfo = [logTypeKey: "verbose"].merged(with: userInfo ?? [String : String]())
        let logMessage = self.logMessage(message, error: error, userInfo: updatedUserInfo, file, function, line)
        internalLogger.verbose(logMessage, file, function, line: Int(line))
    }
    
    public func debug(_ message: String, error: NSError?, userInfo: [String : Any]?, _ file: StaticString, _ function: StaticString, _ line: UInt) {
        let file = String(describing: file)
        let function = String(describing: function)
        let updatedUserInfo = [logTypeKey: "debug"].merged(with: userInfo ?? [String : String]())
        let logMessage = self.logMessage(message, error: error, userInfo: updatedUserInfo, file, function, line)
        internalLogger.debug(logMessage, file, function, line: Int(line))
    }
    
    public func info(_ message: String, error: NSError?, userInfo: [String : Any]?, _ file: StaticString, _ function: StaticString, _ line: UInt) {
        let file = String(describing: file)
        let function = String(describing: function)
        let updatedUserInfo = [logTypeKey: "info"].merged(with: userInfo ?? [String : String]())
        let logMessage = self.logMessage(message, error: error, userInfo: updatedUserInfo, file, function, line)
        internalLogger.info(logMessage, file, function, line: Int(line))
    }
    
    public func warning(_ message: String, error: NSError?, userInfo: [String : Any]?, _ file: StaticString, _ function: StaticString, _ line: UInt) {
        let file = String(describing: file)
        let function = String(describing: function)
        let updatedUserInfo = [logTypeKey: "warning"].merged(with: userInfo ?? [String : String]())
        let logMessage = self.logMessage(message, error: error, userInfo: updatedUserInfo, file, function, line)
        internalLogger.warning(logMessage, file, function, line: Int(line))
    }
    
    public func error(_ message: String, error: NSError?, userInfo: [String : Any]?, _ file: StaticString, _ function: StaticString, _ line: UInt) {
        let file = String(describing: file)
        let function = String(describing: function)
        let updatedUserInfo = [logTypeKey: "error"].merged(with: userInfo ?? [String : Any]())
        let logMessage = self.logMessage(message, error: error, userInfo: updatedUserInfo, file, function, line)
        internalLogger.error(logMessage, file, function, line: Int(line))
    }
    
}

extension Logger {

        return retVal.toJSON() ?? ""
    }
    
    private func mergeOptions(from error:NSError, to dictionary: inout [String:Any], policy: KeyMergePolicy = .encapsulateFlatten) {
        let errorInfo = [errorDomain: error.domain,
                         errorCode: error.code] as [String : Any]
        let errorUserInfo = error.humanReadableError().userInfo as! [String : Any]
