Просмотр исходного кода

Improved logging and logviewer

Jonas Björkert 1 год назад
Родитель
Сommit
e9920524af

+ 2 - 2
LoopFollow/Application/AppDelegate.swift

@@ -25,14 +25,14 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
         notificationCenter.requestAuthorization(options: options) {
             (didAllow, error) in
             if !didAllow {
-                print("User has declined notifications")
+                LogManager.shared.log(category: .general, message: "User has declined notifications")
             }
         }
 
         let store = EKEventStore()
         store.requestCalendarAccess { (granted, error) in
             if !granted {
-                print("Failed to get calendar access: \(String(describing: error))")
+                LogManager.shared.log(category: .calendar, message: "Failed to get calendar access: \(String(describing: error))")
                 return
             }
         }

+ 1 - 1
LoopFollow/BackgroundRefresh/BackgroundRefreshSettingsViewModel.swift

@@ -35,7 +35,7 @@ class BackgroundRefreshSettingsViewModel: ObservableObject {
     }
 
     private func handleBackgroundRefreshTypeChange(_ newValue: BackgroundRefreshType) {
-        print("Background refresh type changed to: \(newValue.rawValue)")
+        LogManager.shared.log(category: .general, message: "Background refresh type changed to: \(newValue.rawValue)")
 
         BLEManager.shared.disconnect()
     }

+ 3 - 3
LoopFollow/Contact/ContactImageUpdater.swift

@@ -17,12 +17,12 @@ class ContactImageUpdater {
     func updateContactImage(bgValue: String, extra: String, stale: Bool) {
         queue.async {
             guard CNContactStore.authorizationStatus(for: .contacts) == .authorized else {
-                print("Access to contacts is not authorized.")
+                LogManager.shared.log(category: .contact, message: "Access to contacts is not authorized.")
                 return
             }
 
             guard let imageData = self.generateContactImage(bgValue: bgValue, extra: extra, stale: stale)?.pngData() else {
-                print("Failed to generate contact image.")
+                LogManager.shared.log(category: .contact, message: "Failed to generate contact image.")
                 return
             }
 
@@ -39,7 +39,7 @@ class ContactImageUpdater {
                     let saveRequest = CNSaveRequest()
                     saveRequest.update(mutableContact)
                     try self.contactStore.execute(saveRequest)
-                    LogManager.shared.log(category: .contact, message: "Contact image updated successfully")
+                    LogManager.shared.log(category: .contact, message: "Contact image updated")
                 } else {
                     let newContact = CNMutableContact()
                     newContact.givenName = contactName

+ 1 - 1
LoopFollow/Controllers/Alarms.swift

@@ -1063,7 +1063,7 @@ extension MainViewController {
             try audioSession.setCategory(.playback, mode: .default)
             try audioSession.setActive(true)
         } catch {
-            print("Failed to set up audio session: \(error)")
+            LogManager.shared.log(category: .alarm, message: "speakBG, Failed to set up audio session: \(error)")
         }
         
         // Get the current time

+ 1 - 1
LoopFollow/Controllers/BackgroundAlertManager.swift

@@ -88,7 +88,7 @@ class BackgroundAlertManager {
 
             UNUserNotificationCenter.current().add(request) { error in
                 if let error = error {
-                    print("Error scheduling \(alert.timeInterval / 60)-minute background alert: \(error)")
+                    LogManager.shared.log(category: .general, message: "Error scheduling \(alert.timeInterval / 60)-minute background alert: \(error)")
                 }
             }
         }

+ 0 - 3
LoopFollow/Controllers/Graphs.swift

@@ -234,8 +234,6 @@ extension MainViewController {
     }
     
     func chartScaled(_ chartView: ChartViewBase, scaleX: CGFloat, scaleY: CGFloat) {
-        print("Chart Scaled: \(BGChart.scaleX), \(BGChart.scaleY)")
-      
         // dont store huge values
         var scale: Float = Float(BGChart.scaleX)
         if(scale > ScaleXMax ) {
@@ -868,7 +866,6 @@ extension MainViewController {
         
         if firstGraphLoad {
             var scaleX = CGFloat(UserDefaultsRepository.chartScaleX.value)
-            print("Scale: \(scaleX)")
             if( scaleX > CGFloat(ScaleXMax) ) {
                 scaleX = CGFloat(ScaleXMax)
                 UserDefaultsRepository.chartScaleX.value = ScaleXMax

+ 1 - 10
LoopFollow/Controllers/Nightscout/BGData.swift

@@ -109,7 +109,7 @@ extension MainViewController {
                     self.ProcessDexBGData(data: nsData2, sourceName: sourceName)
                 }
             case .failure(let error):
-                print("Failed to fetch data: \(error)")
+                LogManager.shared.log(category: .nightscout, message: "Failed to fetch data: \(error)")
                 DispatchQueue.main.async {
                     TaskScheduler.shared.rescheduleTask(
                         id: .fetchBG,
@@ -144,36 +144,27 @@ extension MainViewController {
                     id: .fetchBG,
                     to: Date().addingTimeInterval(5 * 60)
                 )
-                print("##### scheduled BG task in 5 minutes")
-
             } else if secondsAgo >= (10 * 60) {
                 TaskScheduler.shared.rescheduleTask(
                     id: .fetchBG,
                     to: Date().addingTimeInterval(60)
                 )
-                print("##### scheduled BG task in 1 minute")
-
             } else if secondsAgo >= (7 * 60) {
                 TaskScheduler.shared.rescheduleTask(
                     id: .fetchBG,
                     to: Date().addingTimeInterval(30)
                 )
-                print("##### scheduled BG task in 30 seconds")
-
             } else if secondsAgo >= (5 * 60) {
                 TaskScheduler.shared.rescheduleTask(
                     id: .fetchBG,
                     to: Date().addingTimeInterval(10)
                 )
-                print("##### scheduled BG task in 10 seconds")
-
             } else {
                 let delay = (300 - secondsAgo + Double(UserDefaultsRepository.bgUpdateDelay.value))
                 TaskScheduler.shared.rescheduleTask(
                     id: .fetchBG,
                     to: Date().addingTimeInterval(delay)
                 )
-                print("##### scheduled BG task in \(delay) seconds")
 
                 if data.count > 1 {
                     self.evaluateSpeakConditions(currentValue: data[0].sgv, previousValue: data[1].sgv)

+ 1 - 2
LoopFollow/Controllers/Nightscout/CAge.swift

@@ -23,7 +23,7 @@ extension MainViewController {
             case .success(let data):
                 self.updateCage(data: data)
             case .failure(let error):
-                print("Error: \(error.localizedDescription)")
+                LogManager.shared.log(category: .nightscout, message: "webLoadNSCage, error: \(error.localizedDescription)")
             }
         }
     }
@@ -31,7 +31,6 @@ extension MainViewController {
     // NS Cage Response Processor
     func updateCage(data: [cageData]) {
         infoManager.clearInfoData(type: .cage)
-        if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Process: CAGE") }
         if data.count == 0 {
             return
         }

+ 1 - 1
LoopFollow/Controllers/Nightscout/IAge.swift

@@ -27,7 +27,7 @@ extension MainViewController {
                     self.updateIage(data: data)
                 }
             case .failure(let error):
-                print("Failed to fetch data: \(error.localizedDescription)")
+                LogManager.shared.log(category: .nightscout, message: "webLoadNSIage, failed to fetch data: \(error.localizedDescription)")
             }
         }
     }

+ 1 - 3
LoopFollow/Controllers/Nightscout/Profile.swift

@@ -15,15 +15,13 @@ extension MainViewController {
             case .success(let profileData):
                 self.updateProfile(profileData: profileData)
             case .failure(let error):
-                print("Error fetching profile data: \(error.localizedDescription)")
+                LogManager.shared.log(category: .nightscout, message: "webLoadNSProfile, error fetching profile data: \(error.localizedDescription)")
             }
         }
     }
     
     // NS Profile Response Processor
     func updateProfile(profileData: NSProfile) {
-        if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Process: profile") }
-        
         guard let store = profileData.store["default"] ?? profileData.store["Default"] else {
             return
         }

+ 1 - 2
LoopFollow/Controllers/Nightscout/SAge.swift

@@ -27,7 +27,7 @@ extension MainViewController {
                     self.updateSage(data: data)
                 }
             case .failure(let error):
-                print("Failed to fetch data: \(error.localizedDescription)")
+                LogManager.shared.log(category: .nightscout, message: "webLoadNSSage, failed to fetch data: \(error.localizedDescription)")
             }
         }
     }
@@ -62,7 +62,6 @@ extension MainViewController {
         if let sageTime = formatter.date(from: (lastSageString as! String))?.timeIntervalSince1970 {
             let now = dateTimeUtils.getNowTimeIntervalUTC()
             let secondsAgo = now - sageTime
-            let days = 24 * 60 * 60
             
             let formatter = DateComponentsFormatter()
             formatter.unitsStyle = .positional // Use the appropriate positioning for the current locale

+ 2 - 2
LoopFollow/Controllers/Nightscout/Treatments.swift

@@ -28,10 +28,10 @@ extension MainViewController {
                         self.updateTreatments(entries: entries)
                     }
                 } else {
-                    print("Error: Unexpected data structure")
+                    LogManager.shared.log(category: .nightscout, message: "WebLoadNSTreatments, Unexpected data structure")
                 }
             case .failure(let error):
-                print("Error: \(error.localizedDescription)")
+                LogManager.shared.log(category: .nightscout, message: "WebLoadNSTreatments, error \(error.localizedDescription)")
             }
         }
     }

+ 5 - 2
LoopFollow/Helpers/BackgroundTaskAudio.swift

@@ -22,9 +22,11 @@ class BackgroundTask {
     func stopBackgroundTask() {
         NotificationCenter.default.removeObserver(self, name: AVAudioSession.interruptionNotification, object: nil)
         player.stop()
+        LogManager.shared.log(category: .general, message: "Silent audio stopped")
     }
     
     @objc fileprivate func interruptedAudio(_ notification: Notification) {
+        LogManager.shared.log(category: .general, message: "Silent audio interrupted")
         if notification.name == AVAudioSession.interruptionNotification && notification.userInfo != nil {
             var info = notification.userInfo!
             var intValue = 0
@@ -46,8 +48,9 @@ class BackgroundTask {
             self.player.volume = 0.01
             self.player.prepareToPlay()
             self.player.play()
-            print("silent audio playing")
-        } catch { print(error)
+            LogManager.shared.log(category: .general, message: "Silent audio playing")
+        } catch {
+            LogManager.shared.log(category: .general, message: "playAudio, error: \(error)")
         }
     }
 }

+ 2 - 0
LoopFollow/Log/LogManager.swift

@@ -24,6 +24,8 @@ class LogManager {
         case contact = "Contact"
         case taskScheduler = "Task Scheduler"
         case dexcom = "Dexcom"
+        case alarm = "Alarm"
+        case calendar = "Calendar"
     }
 
     init() {

+ 9 - 2
LoopFollow/Log/LogViewModel.swift

@@ -77,10 +77,17 @@ class LogViewModel: ObservableObject {
             guard let self = self else { return }
             var filtered = self.allLogEntries
 
-            // Filter by category
+            // Filter by category and remove category tag
             if let category = category {
-                let categoryTag = "[\(category.rawValue)]"
+                let categoryTag = "[\(category.rawValue)] "
                 filtered = filtered.filter { $0.text.contains(categoryTag) }
+                    .map { logEntry in
+                        var text = logEntry.text
+                        if let range = text.range(of: categoryTag) {
+                            text.removeSubrange(range)
+                        }
+                        return LogEntry(id: logEntry.id, text: text.trimmingCharacters(in: .whitespaces))
+                    }
             }
 
             // Filter by search text

+ 2 - 8
LoopFollow/ViewControllers/MainViewController.swift

@@ -541,13 +541,9 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
     }
     
     func writeCalendar() {
-        if UserDefaultsRepository.debugLog.value {
-            self.writeDebugLog(value: "Write calendar start")
-        }
-        
         self.store.requestCalendarAccess { (granted, error) in
             if !granted {
-                print("Failed to get calendar access: \(String(describing: error))")
+                LogManager.shared.log(category: .calendar, message: "Failed to get calendar access: \(String(describing: error))")
                 return
             }
             self.processCalendarUpdates()
@@ -652,9 +648,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele
             //if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Calendar Write: " + eventTitle) }
             //UserDefaultsRepository.savedEventID.value = event.eventIdentifier //save event id to access this particular event later
         } catch {
-            print("*** Error storing to the calendar")
-            // Display error to user
-            //if UserDefaultsRepository.debugLog.value { self.writeDebugLog(value: "Error: Calendar Write") }
+            LogManager.shared.log(category: .calendar, message: "Error storing to the calendar")
         }
     }