mac: centralize log path lookup
parent
27d8aa0f04
commit
c4eff00ed7
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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>
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue