mirror of
https://github.com/meshtastic/Meshtastic-Apple.git
synced 2026-04-20 22:13:56 +00:00
Log Cleanup
This commit is contained in:
parent
65e8ae4071
commit
447d82030a
5 changed files with 106 additions and 73 deletions
|
|
@ -5052,9 +5052,6 @@
|
|||
},
|
||||
"Debug Log" : {
|
||||
|
||||
},
|
||||
"Debug Logs" : {
|
||||
|
||||
},
|
||||
"Debug Logs%@" : {
|
||||
|
||||
|
|
|
|||
|
|
@ -670,7 +670,7 @@ func telemetryPacket(packet: MeshPacket, connectedNode: Int64, context: NSManage
|
|||
telemetry.voltage = telemetryMessage.deviceMetrics.voltage
|
||||
telemetry.uptimeSeconds = Int32(telemetryMessage.deviceMetrics.uptimeSeconds)
|
||||
telemetry.metricsType = 0
|
||||
Logger.statistics.info("📈 [Mesh Statistics] Channel Utilization: \(telemetryMessage.deviceMetrics.channelUtilization, privacy: .public) Airtime: \(telemetryMessage.deviceMetrics.airUtilTx, privacy: .public) for Node: \(packet.from.toHex(), privacy: .public))")
|
||||
Logger.statistics.info("📈 [Mesh Statistics] Channel Utilization: \(telemetryMessage.deviceMetrics.channelUtilization, privacy: .public) Airtime: \(telemetryMessage.deviceMetrics.airUtilTx, privacy: .public) for Node: \(packet.from.toHex(), privacy: .public)")
|
||||
} else if telemetryMessage.variant == Telemetry.OneOf_Variant.environmentMetrics(telemetryMessage.environmentMetrics) {
|
||||
// Environment Metrics
|
||||
telemetry.barometricPressure = telemetryMessage.environmentMetrics.barometricPressure
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import SwiftUI
|
|||
import OSLog
|
||||
|
||||
/// Needed for TableColumnForEach
|
||||
@available(iOS 17.4, macOS 14.4, *)
|
||||
@available(iOS 17.0, macOS 14.0, *)
|
||||
struct AppLog: View {
|
||||
|
||||
@State private var logs: [OSLogEntryLog] = []
|
||||
|
|
@ -33,60 +33,101 @@ struct AppLog: View {
|
|||
.secondFraction(.fractional(3))
|
||||
|
||||
var body: some View {
|
||||
|
||||
Table(logs, selection: $selection, sortOrder: $sortOrder) {
|
||||
if idiom != .phone {
|
||||
TableColumn("log.time") { value in
|
||||
Text(value.date.formatted(dateFormatStyle))
|
||||
}
|
||||
.width(min: 125, max: 150)
|
||||
TableColumn("log.level") { value in
|
||||
Text(value.level.description)
|
||||
.foregroundStyle(value.level.color)
|
||||
}
|
||||
.width(min: 85, max: 110)
|
||||
TableColumn("log.category", value: \.category)
|
||||
.width(min: 80, max: 130)
|
||||
}
|
||||
TableColumn("log.message", value: \.composedMessage) { value in
|
||||
Text(value.composedMessage)
|
||||
.foregroundStyle(value.level.color)
|
||||
.font(idiom == .phone ? .caption : .body)
|
||||
}
|
||||
.width(ideal: 200, max: .infinity)
|
||||
}
|
||||
.monospaced()
|
||||
|
||||
.safeAreaInset(edge: .bottom, alignment: .trailing) {
|
||||
HStack {
|
||||
Button(action: {
|
||||
withAnimation {
|
||||
isEditingFilters = !isEditingFilters
|
||||
HStack {
|
||||
|
||||
if idiom == .phone {
|
||||
Table(logs, selection: $selection, sortOrder: $sortOrder) {
|
||||
TableColumn("log.message", value: \.composedMessage) { value in
|
||||
Text(value.composedMessage)
|
||||
.foregroundStyle(value.level.color)
|
||||
.font(idiom == .phone ? .caption : .body)
|
||||
}
|
||||
}) {
|
||||
Image(systemName: !isEditingFilters ? "line.3.horizontal.decrease.circle" : "line.3.horizontal.decrease.circle.fill")
|
||||
.padding(.vertical, 5)
|
||||
.width(ideal: 200, max: .infinity)
|
||||
}
|
||||
.monospaced()
|
||||
.safeAreaInset(edge: .bottom, alignment: .trailing) {
|
||||
HStack {
|
||||
Button(action: {
|
||||
withAnimation {
|
||||
isEditingFilters = !isEditingFilters
|
||||
}
|
||||
}) {
|
||||
Image(systemName: !isEditingFilters ? "line.3.horizontal.decrease.circle" : "line.3.horizontal.decrease.circle.fill")
|
||||
.padding(.vertical, 5)
|
||||
}
|
||||
.tint(Color(UIColor.secondarySystemBackground))
|
||||
.foregroundColor(.accentColor)
|
||||
.buttonStyle(.borderedProminent)
|
||||
|
||||
}
|
||||
.controlSize(.regular)
|
||||
.padding(5)
|
||||
}
|
||||
.padding(.bottom, 5)
|
||||
.padding(.trailing, 5)
|
||||
.searchable(text: $searchText, placement: .navigationBarDrawer, prompt: "Search")
|
||||
.disabled(selection != nil)
|
||||
.overlay {
|
||||
if logs.isEmpty {
|
||||
ContentUnavailableView("No Logs Available", systemImage: "scroll")
|
||||
}
|
||||
}
|
||||
.refreshable {
|
||||
await logs = searchAppLogs()
|
||||
logs.sort(using: sortOrder)
|
||||
}
|
||||
} else {
|
||||
Table(logs, selection: $selection, sortOrder: $sortOrder) {
|
||||
TableColumn("log.time") { value in
|
||||
Text(value.date.formatted(dateFormatStyle))
|
||||
}
|
||||
.width(min: 125, max: 150)
|
||||
TableColumn("log.level") { value in
|
||||
Text(value.level.description)
|
||||
.foregroundStyle(value.level.color)
|
||||
}
|
||||
.width(min: 85, max: 110)
|
||||
TableColumn("log.category", value: \.category)
|
||||
.width(min: 80, max: 130)
|
||||
TableColumn("log.message", value: \.composedMessage) { value in
|
||||
Text(value.composedMessage)
|
||||
.foregroundStyle(value.level.color)
|
||||
.font(idiom == .phone ? .caption : .body)
|
||||
}
|
||||
.width(ideal: 200, max: .infinity)
|
||||
}
|
||||
.monospaced()
|
||||
.safeAreaInset(edge: .bottom, alignment: .trailing) {
|
||||
HStack {
|
||||
Button(action: {
|
||||
withAnimation {
|
||||
isEditingFilters = !isEditingFilters
|
||||
}
|
||||
}) {
|
||||
Image(systemName: !isEditingFilters ? "line.3.horizontal.decrease.circle" : "line.3.horizontal.decrease.circle.fill")
|
||||
.padding(.vertical, 5)
|
||||
}
|
||||
.tint(Color(UIColor.secondarySystemBackground))
|
||||
.foregroundColor(.accentColor)
|
||||
.buttonStyle(.borderedProminent)
|
||||
}
|
||||
.controlSize(.regular)
|
||||
.padding(5)
|
||||
}
|
||||
.padding(.bottom, 5)
|
||||
.padding(.trailing, 5)
|
||||
.searchable(text: $searchText, placement: .navigationBarDrawer, prompt: "Search")
|
||||
.disabled(selection != nil)
|
||||
.overlay {
|
||||
if logs.isEmpty {
|
||||
ContentUnavailableView("No Logs Available", systemImage: "scroll")
|
||||
}
|
||||
}
|
||||
.refreshable {
|
||||
await logs = searchAppLogs()
|
||||
logs.sort(using: sortOrder)
|
||||
}
|
||||
.tint(Color(UIColor.secondarySystemBackground))
|
||||
.foregroundColor(.accentColor)
|
||||
.buttonStyle(.borderedProminent)
|
||||
|
||||
}
|
||||
.controlSize(.regular)
|
||||
.padding(5)
|
||||
}
|
||||
.padding(.bottom, 5)
|
||||
.padding(.trailing, 5)
|
||||
.searchable(text: $searchText, placement: .navigationBarDrawer, prompt: "Search")
|
||||
.disabled(selection != nil)
|
||||
.overlay {
|
||||
if logs.isEmpty {
|
||||
ContentUnavailableView("No Logs Available", systemImage: "scroll")
|
||||
}
|
||||
}
|
||||
.refreshable {
|
||||
await logs = searchAppLogs()
|
||||
logs.sort(using: sortOrder)
|
||||
}
|
||||
.onChange(of: sortOrder) { _, sortOrder in
|
||||
withAnimation {
|
||||
|
|
@ -176,7 +217,7 @@ struct AppLog: View {
|
|||
}
|
||||
}
|
||||
|
||||
@available(iOS 17.4, macOS 14.4, *)
|
||||
@available(iOS 17.0, macOS 14.0, *)
|
||||
extension AppLog {
|
||||
@MainActor
|
||||
private func searchAppLogs() async -> [OSLogEntryLog] {
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ struct MeshLog: View {
|
|||
let url = logFile!
|
||||
logs.removeAll()
|
||||
var lineCount = 0
|
||||
let lineLimit = 1000
|
||||
let lineLimit = 10000
|
||||
// Get the number of lines
|
||||
for try await _ in url.lines {
|
||||
lineCount += 1
|
||||
|
|
|
|||
|
|
@ -243,20 +243,12 @@ struct Settings: View {
|
|||
|
||||
var loggingSection: some View {
|
||||
Section(header: Text("logging")) {
|
||||
NavigationLink(value: SettingsNavigationState.meshLog) {
|
||||
Label {
|
||||
Text("mesh.log")
|
||||
} icon: {
|
||||
Image(systemName: "list.bullet.rectangle")
|
||||
}
|
||||
}
|
||||
|
||||
if #available (iOS 17.4, *) {
|
||||
if #available (iOS 17.0, *) {
|
||||
NavigationLink(value: SettingsNavigationState.debugLogs) {
|
||||
Label {
|
||||
Text("Debug Logs")
|
||||
Text("Logs")
|
||||
} icon: {
|
||||
Image(systemName: "stethoscope")
|
||||
Image(systemName: "scroll")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -265,6 +257,13 @@ struct Settings: View {
|
|||
|
||||
var developersSection: some View {
|
||||
Section(header: Text("Developers")) {
|
||||
NavigationLink(value: SettingsNavigationState.meshLog) {
|
||||
Label {
|
||||
Text("mesh.log")
|
||||
} icon: {
|
||||
Image(systemName: "list.bullet.rectangle")
|
||||
}
|
||||
}
|
||||
NavigationLink(value: SettingsNavigationState.appFiles) {
|
||||
Label {
|
||||
Text("App Files")
|
||||
|
|
@ -469,17 +468,13 @@ struct Settings: View {
|
|||
case .telemetry:
|
||||
TelemetryConfig(node: node)
|
||||
case .meshLog:
|
||||
#if DEBUG
|
||||
MeshLog()
|
||||
#endif
|
||||
case .debugLogs:
|
||||
if #available(iOS 17.4, *) {
|
||||
AppLog()
|
||||
}
|
||||
case .appFiles:
|
||||
#if DEBUG
|
||||
AppData()
|
||||
#endif
|
||||
case .firmwareUpdates:
|
||||
Firmware(node: node)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue