mac: centralize log path lookup

main
Peter Steinberger 2025-12-10 00:03:37 +00:00
parent 27d8aa0f04
commit c4eff00ed7
4 changed files with 42 additions and 31 deletions

View File

@ -96,7 +96,7 @@ enum DebugActions {
let reason = rpcResult.error?.trimmingCharacters(in: .whitespacesAndNewlines) let reason = rpcResult.error?.trimmingCharacters(in: .whitespacesAndNewlines)
let detail = (reason?.isEmpty == false) let detail = (reason?.isEmpty == false)
? reason! ? reason!
: "No error returned. Check /tmp/clawdis.log or rpc output." : "No error returned. Check logs or rpc output."
return .failure(.message("Local send failed: \(detail)")) return .failure(.message("Local send failed: \(detail)"))
} }
} catch { } catch {
@ -114,14 +114,7 @@ enum DebugActions {
} }
static func pinoLogPath() -> String { static func pinoLogPath() -> String {
let df = DateFormatter() LogLocator.bestLogFile()?.path ?? LogLocator.legacyLogPath
df.calendar = Calendar(identifier: .iso8601)
df.locale = Locale(identifier: "en_US_POSIX")
df.dateFormat = "yyyy-MM-dd"
let today = df.string(from: Date())
let rolling = URL(fileURLWithPath: "/tmp/clawdis/clawdis-\(today).log").path
if FileManager.default.fileExists(atPath: rolling) { return rolling }
return "/tmp/clawdis.log"
} }
@MainActor @MainActor

View File

@ -522,26 +522,7 @@ extension GeneralSettings {
} }
private func revealLogs() { private func revealLogs() {
let fm = FileManager.default let target = LogLocator.bestLogFile()
let legacy = URL(fileURLWithPath: "/tmp/clawdis/clawdis.log")
let rollingDir = URL(fileURLWithPath: "/tmp/clawdis")
// Prefer the newest rolling log (clawdis-YYYY-MM-DD.log), fall back to legacy path.
let dirContents = (try? fm.contentsOfDirectory(
at: rollingDir,
includingPropertiesForKeys: [.contentModificationDateKey],
options: [.skipsHiddenFiles])) ?? []
let rollingLog = dirContents
.filter { $0.lastPathComponent.hasPrefix("clawdis-") && $0.pathExtension == "log" }
.sorted { lhs, rhs in
let lDate = (try? lhs.resourceValues(forKeys: [.contentModificationDateKey]).contentModificationDate) ?? .distantPast
let rDate = (try? rhs.resourceValues(forKeys: [.contentModificationDateKey]).contentModificationDate) ?? .distantPast
return lDate > rDate
}
.first
let target = rollingLog ?? (fm.fileExists(atPath: legacy.path) ? legacy : nil)
if let target { if let target {
NSWorkspace.shared.selectFile(target.path, inFileViewerRootedAtPath: target.deletingLastPathComponent().path) NSWorkspace.shared.selectFile(target.path, inFileViewerRootedAtPath: target.deletingLastPathComponent().path)

View File

@ -0,0 +1,37 @@
import Foundation
enum LogLocator {
private static let logDir = URL(fileURLWithPath: "/tmp/clawdis")
private static let legacyLog = logDir.appendingPathComponent("clawdis.log")
/// Returns the newest rolling log (clawdis-YYYY-MM-DD.log) if it exists, falling back to the legacy single-file log.
static func bestLogFile() -> URL? {
let fm = FileManager.default
let rollingFiles = (try? fm.contentsOfDirectory(
at: logDir,
includingPropertiesForKeys: [.contentModificationDateKey],
options: [.skipsHiddenFiles])) ?? []
let newestRolling = rollingFiles
.filter { $0.lastPathComponent.hasPrefix("clawdis-") && $0.pathExtension == "log" }
.sorted { lhs, rhs in
let lDate = (try? lhs.resourceValues(forKeys: [.contentModificationDateKey]).contentModificationDate) ?? .distantPast
let rDate = (try? rhs.resourceValues(forKeys: [.contentModificationDateKey]).contentModificationDate) ?? .distantPast
return lDate > rDate
}
.first
if let rolling = newestRolling {
return rolling
}
if fm.fileExists(atPath: legacyLog.path) {
return legacyLog
}
return nil
}
/// Legacy path used by launchd stdout/err; exposed for plist generation.
static var legacyLogPath: String {
legacyLog.path
}
}

View File

@ -80,9 +80,9 @@ enum LaunchAgentManager {
<true/> <true/>
</dict> </dict>
<key>StandardOutPath</key> <key>StandardOutPath</key>
<string>/tmp/clawdis.log</string> <string>\(LogLocator.legacyLogPath)</string>
<key>StandardErrorPath</key> <key>StandardErrorPath</key>
<string>/tmp/clawdis.log</string> <string>\(LogLocator.legacyLogPath)</string>
</dict> </dict>
</plist> </plist>
""" """