[Console-Log]: Added raw console logging in ErrorLog section (ladybug icon)

This commit is contained in:
Magesh K
2024-12-29 03:12:59 +05:30
parent 2e247f1773
commit 2e01116f1f
9 changed files with 616 additions and 17 deletions

View File

@@ -16,6 +16,7 @@ import Roxas
import Nuke
import QuickLook
import SwiftUI
final class ErrorLogViewController: UITableViewController, QLPreviewControllerDelegate
{
@@ -216,15 +217,124 @@ private extension ErrorLogViewController
}
}
@IBAction func showMinimuxerLogs(_ sender: UIBarButtonItem)
{
// Show minimuxer.log
let previewController = QLPreviewController()
previewController.dataSource = self
let navigationController = UINavigationController(rootViewController: previewController)
present(navigationController, animated: true, completion: nil)
enum LogView: String {
case consoleLog = "console-log"
case minimuxerLog = "minimuxer-log"
// // This class will manage the QLPreviewController and the timer.
// private class LogViewManager {
// var previewController: QLPreviewController
// var refreshTimer: Timer?
//
// init(previewController: QLPreviewController) {
// self.previewController = previewController
// }
//
// // Start refreshing the preview controller every second
// func startRefreshing() {
// refreshTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(refreshPreview), userInfo: nil, repeats: true)
// }
//
// @objc private func refreshPreview() {
// previewController.reloadData()
// }
//
// // Stop the timer to prevent leaks
// func stopRefreshing() {
// refreshTimer?.invalidate()
// refreshTimer = nil
// }
// }
//
// // Method to get the QLPreviewController for this log type
// func getViewController(_ dataSource: QLPreviewControllerDataSource) -> QLPreviewController {
// let previewController = QLPreviewController()
// previewController.restorationIdentifier = self.rawValue
// previewController.dataSource = dataSource
//
// // Create LogViewManager and start refreshing
// let manager = LogViewManager(previewController: previewController)
// manager.startRefreshing()
//
// return previewController
// }
// This class will manage the QLPreviewController and the timer.
private class LogViewManager {
var previewController: QLPreviewController
var refreshTimer: Timer?
var logView: LogView
init(previewController: QLPreviewController, logView: LogView) {
self.previewController = previewController
self.logView = logView
}
// Start refreshing the preview controller every second
func startRefreshing() {
refreshTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(refreshPreview), userInfo: nil, repeats: true)
}
@objc private func refreshPreview() {
previewController.reloadData()
}
// Stop the timer to prevent leaks
func stopRefreshing() {
refreshTimer?.invalidate()
refreshTimer = nil
}
func updateLogPath() {
// Force the QLPreviewController to reload by changing the file path
previewController.reloadData()
}
}
// Method to get the QLPreviewController for this log type
func getViewController(_ dataSource: QLPreviewControllerDataSource) -> QLPreviewController {
let previewController = QLPreviewController()
previewController.restorationIdentifier = self.rawValue
previewController.dataSource = dataSource
// Create LogViewManager and start refreshing
let manager = LogViewManager(previewController: previewController, logView: self)
manager.startRefreshing()
return previewController
}
func getLogPath() -> URL {
switch self {
case .consoleLog:
let appDelegate = UIApplication.shared.delegate as! AppDelegate
return appDelegate.consoleLog.logFileURL
case .minimuxerLog:
return FileManager.default.documentsDirectory.appendingPathComponent("minimuxer.log")
}
}
}
@IBAction func showMinimuxerLogs(_ sender: UIBarButtonItem) {
// Create the SwiftUI ConsoleLogView with the URL
let consoleLogView = ConsoleLogView(logURL: (UIApplication.shared.delegate as! AppDelegate).consoleLog.logFileURL)
// Create the UIHostingController
let consoleLogController = UIHostingController(rootView: consoleLogView)
// Configure the bottom sheet presentation
consoleLogController.modalPresentationStyle = .pageSheet
if let sheet = consoleLogController.sheetPresentationController {
sheet.detents = [.medium(), .large()] // You can adjust the size of the sheet (medium/large)
sheet.prefersGrabberVisible = true // Optional: Shows a grabber at the top of the sheet
sheet.selectedDetentIdentifier = .large // Default size when presented
}
// Present the bottom sheet
present(consoleLogController, animated: true, completion: nil)
}
@IBAction func clearLoggedErrors(_ sender: UIBarButtonItem)
{
let alertController = UIAlertController(title: NSLocalizedString("Are you sure you want to clear the error log?", comment: ""), message: nil, preferredStyle: .actionSheet)
@@ -297,13 +407,21 @@ private extension ErrorLogViewController
// All logs since the app launched.
let position = store.position(timeIntervalSinceLatestBoot: 0)
let predicate = NSPredicate(format: "subsystem == %@", Logger.altstoreSubsystem)
let entries = try store.getEntries(at: position, matching: predicate)
.compactMap { $0 as? OSLogEntryLog }
.map { "[\($0.date.formatted())] [\($0.category)] [\($0.level.localizedName)] \($0.composedMessage)" }
let outputText = entries.joined(separator: "\n")
// let predicate = NSPredicate(format: "subsystem == %@", Logger.altstoreSubsystem)
//
// let entries = try store.getEntries(at: position, matching: predicate)
// .compactMap { $0 as? OSLogEntryLog }
// .map { "[\($0.date.formatted())] [\($0.category)] [\($0.level.localizedName)] \($0.composedMessage)" }
//
// Remove the predicate to get all log entries
// let entries = try store.getEntries(at: position)
// .compactMap { $0 as? OSLogEntryLog }
// .map { "[\($0.date.formatted())] [\($0.category)] [\($0.level.localizedName)] \($0.composedMessage)" }
let entries = try store.getEntries(at: position)
// let outputText = entries.joined(separator: "\n")
let outputText = entries.map { $0.description }.joined(separator: "\n")
let outputDirectory = FileManager.default.uniqueTemporaryURL()
try FileManager.default.createDirectory(at: outputDirectory, withIntermediateDirectories: true)
@@ -412,9 +530,13 @@ extension ErrorLogViewController: QLPreviewControllerDataSource {
return 1
}
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
let fileURL = FileManager.default.documentsDirectory.appendingPathComponent("minimuxer.log")
return fileURL as QLPreviewItem
func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem
{
guard let identifier = controller.restorationIdentifier,
let logView = LogView(rawValue: identifier) else {
fatalError("Invalid restorationIdentifier")
}
return logView.getLogPath() as QLPreviewItem
}
}