mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-12 21:53:00 -06:00
0dbdf994b3
* feat(macos): isolate named app profiles * refactor(macos): isolate profile launch ownership * fix(macos): avoid overlapping approvals socket access * fix(macos): declare profile defaults concurrency ownership * fix(macos): return profiled node launch arguments * chore(i18n): refresh macOS profile source inventory * fix(macos): gate profile startup before services * test(macos): evaluate profile state before assertions * fix(daemon): skip absent launchd deactivation * fix(macos): fail closed on profile port conflicts * chore(i18n): refresh profile conflict inventory * fix(macos): ignore non-gateway launch agent claims * test(macos): stabilize profile lifecycle timing * fix(macos): remove stale dashboard URL * chore(macos): refresh native source baseline
61 lines
2.0 KiB
Swift
61 lines
2.0 KiB
Swift
import Foundation
|
|
|
|
enum LogLocator {
|
|
private static var logDir: URL {
|
|
if let override = ProcessInfo.processInfo.environment["OPENCLAW_LOG_DIR"],
|
|
!override.isEmpty
|
|
{
|
|
return URL(fileURLWithPath: override)
|
|
}
|
|
return URL(fileURLWithPath: "/tmp/openclaw")
|
|
}
|
|
|
|
private static var stdoutLog: URL {
|
|
logDir.appendingPathComponent("openclaw-stdout.log")
|
|
}
|
|
|
|
private static var gatewayLog: URL {
|
|
let suffix = AppProfile.current.name.map { "-\($0)" } ?? ""
|
|
return logDir.appendingPathComponent("openclaw-gateway\(suffix).log")
|
|
}
|
|
|
|
private static func ensureLogDirExists() {
|
|
try? FileManager().createDirectory(at: self.logDir, withIntermediateDirectories: true)
|
|
}
|
|
|
|
private static func modificationDate(for url: URL) -> Date {
|
|
(try? url.resourceValues(forKeys: [.contentModificationDateKey]).contentModificationDate) ?? .distantPast
|
|
}
|
|
|
|
/// Returns the newest log file under /tmp/openclaw/ (rolling or stdout), or nil if none exist.
|
|
static func bestLogFile() -> URL? {
|
|
self.ensureLogDirExists()
|
|
let fm = FileManager()
|
|
let files = (try? fm.contentsOfDirectory(
|
|
at: self.logDir,
|
|
includingPropertiesForKeys: [.contentModificationDateKey],
|
|
options: [.skipsHiddenFiles])) ?? []
|
|
|
|
let prefixes = ["openclaw"]
|
|
return files
|
|
.filter { file in
|
|
prefixes.contains { file.lastPathComponent.hasPrefix($0) } && file.pathExtension == "log"
|
|
}
|
|
.max { lhs, rhs in
|
|
self.modificationDate(for: lhs) < self.modificationDate(for: rhs)
|
|
}
|
|
}
|
|
|
|
/// Path to use for launchd stdout/err.
|
|
static var launchdLogPath: String {
|
|
self.ensureLogDirExists()
|
|
return stdoutLog.path
|
|
}
|
|
|
|
/// Path to use for the Gateway launchd job stdout/err.
|
|
static var launchdGatewayLogPath: String {
|
|
self.ensureLogDirExists()
|
|
return gatewayLog.path
|
|
}
|
|
}
|