         }
         set(value) {
             super.frame = value
-            self.tableView.frame = CGRect(x: 0, y: 20, width: self.bounds.width, height: self.bounds.height - 20)
-        }
-    }
-    
-    private var logs = Array<Log>()
+            self.textView.frame = CGRect(x: 0, y: 20, width: self.bounds.width, height: self.bounds.height - 20)
+        }
+    }
+    
     private let logKey = "FKConsoleLog"
+    private var logsAttributedString = NSMutableAttributedString.init(string: "")
+    private lazy var logs: [Log] = {
+        var logs = [Log]()
+        if !FKConsole.console.shouldSaveLogsToDisk {
+            return logs
+        }
+        guard let logsData = UserDefaults.standard.object(forKey: self.logKey) as? Data else {
+            return logs
+        }
+        guard let logsArray = NSKeyedUnarchiver.unarchiveObject(with: logsData) as? [Log] else {
+            return logs
+        }
+        for log in logsArray {
+            self.logsAttributedString.append(self.handleLog(log))
+        }
+        logs.append(contentsOf: logsArray)
+        return logs
+    }()
     
     // MARK:- LogView functions
     public func addLog(_ log: Log) {
         self.logs.append(log)
-        let indexPath = IndexPath(row: logs.count - 1, section: 0)
-        self.tableView.insertRows(at: [indexPath], with: UITableViewRowAnimation.none)
+        self.logsAttributedString.append(self.handleLog(log))
+        self.textView.attributedText = self.logsAttributedString
     }
     
     public func clearLogs() {
         self.logs.removeAll()
-        self.tableView.reloadData()
-    }
-    
-    public func saveLogs() {
+        self.logsAttributedString = NSMutableAttributedString.init(string: "")
+        self.textView.attributedText = self.logsAttributedString
+    }
+    
+    @objc fileprivate func saveLogs() {
         if !FKConsole.console.shouldSaveLogsToDisk {
             return
         }
         let logsData = NSKeyedArchiver.archivedData(withRootObject: self.logs)
         UserDefaults.standard.set(logsData, forKey: logKey)
         UserDefaults.standard.synchronize()
-    }
-    
-    fileprivate func loadLogsFromDisk() {
-        if !FKConsole.console.shouldSaveLogsToDisk {
-            return
-        }
-        guard let logsData = UserDefaults.standard.object(forKey: logKey) as? Data else {
-            return
-        }
-        guard let logs = NSKeyedUnarchiver.unarchiveObject(with: logsData) as? [Log] else {
-            return
-        }
-        self.logs.removeAll()
-        self.logs.append(contentsOf: logs)
     }
     
     // MARK: Register observer for App did enter background and App will Terminate

        return closeButton
    }()
    
    private lazy var clearButton: UIButton = {
        let clearButton = UIButton.init(type: UIButtonType.custom)
        clearButton.setTitle("C", for: UIControlState.normal)
        clearButton.titleLabel?.font = UIFont.systemFont(ofSize: 28)

    /// Color of error logs, default is red.
    public var errorColor: UIColor = UIColor.red
    
    /// Font of logs, default is system font of 15 pix.
    public var font: UIFont = UIFont.systemFont(ofSize: 15) {
        didSet {
            self.logView.textView.font = font
        }
    }
    
    fileprivate var shownWindow: UIWindow?
    fileprivate var showGesture: UIGestureRecognizer!
    fileprivate var hideGesture: UIGestureRecognizer!
    fileprivate var animating: Bool = false
    fileprivate var originalStatusBarStyle: UIStatusBarStyle?
    
    fileprivate lazy var logView: LogView = {
        let logView = LogView.init(frame: CGRect(x:0, y:0, width:SCREEN_WIDTH, height:SCREEN_HEIGHT))
        logView.backgroundColor = UIColor.white
        logView.textView.font = self.font
        self.addSubview(logView)
        return logView
    }()
    
    fileprivate lazy var closeButton: UIButton = {
        let closeButton = UIButton.init(type: UIButtonType.custom)
        closeButton.setTitle("×", for: UIControlState.normal)
        closeButton.titleLabel?.font = UIFont.systemFont(ofSize: 28)
