zeroclaw-labs/zeroclaw · error · anyhow::Error
Service log viewing is supported on macOS, Linux, and…
Error message
Service log viewing is supported on macOS, Linux, and Windows only
What it means
logs() dispatches to logs_macos, logs_linux (after resolving the init system) or logs_windows. Unlike the management verbs, the message correctly includes Windows; the bail fires only on remaining platforms such as the BSDs.
Solutions
- Read the daemon's log files directly with tail on whatever path your manual service definition uses
- Run the daemon in the foreground during debugging instead of relying on 'service logs'
- Add platform support or route logging to a file you control
Defensive patterns
Strategy: validation
Validate before calling
fn service_logs_supported() -> bool {
cfg!(any(target_os = "macos", target_os = "linux", target_os = "windows"))
} Prevention
- Route daemon logging to a file you control on unsupported platforms
- Gate 'service logs' by OS in tooling
- Run the daemon in the foreground when you need logs off-platform
When it happens
Trigger: Running 'zeroclaw service logs' on a platform where none of the three cfg! branches match.
Common situations: Attempting to tail daemon logs on FreeBSD/OpenBSD builds; scripts assuming journalctl-like tooling exists everywhere.
Understand the failure class
Background: "unsupported platform" / "not supported on this platform" errors: what they mean and how to fix them — this error's family across 47 libraries.
Related errors
- Service management is supported on macOS and Linux only
- No log files found at
- No log files found in
- the launchd daemon runner is only supported on macOS
- the OpenRC log writer is only supported on Linux
AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23).
Data as JSON: /api/errors/593736e75c717884.
Report an issue: GitHub.
Appendix: source
Thrown at crates/zeroclaw-runtime/src/service/mod.rs:948
println!("Unit: /etc/init.d/{}", linux_openrc_service(config));
}
InitSystem::Auto => unreachable!("Auto should be resolved before this point"),
}
Ok(())
}
pub fn logs(config: &Config, init_system: InitSystem, lines: usize, follow: bool) -> Result<()> {
if cfg!(target_os = "macos") {
return logs_macos(config, lines, follow);
}
if cfg!(target_os = "linux") {
let resolved = init_system.resolve()?;
return logs_linux(config, resolved, lines, follow);
}
if cfg!(target_os = "windows") {
return logs_windows(config, lines, follow);
}
anyhow::bail!("Service log viewing is supported on macOS, Linux, and Windows only")
}
fn logs_macos(config: &Config, lines: usize, follow: bool) -> Result<()> {
// Try the launchd log files first (StandardOutPath / StandardErrorPath from the plist).
// These are the most reliable source since they capture all daemon output.
let exe = std::env::current_exe().ok();
let homebrew_var_dir = exe.as_ref().and_then(|e| homebrew_var_dir_from_exe(e));
let logs_dir = if let Some(ref var_dir) = homebrew_var_dir {
var_dir.join("logs")
} else {
config
.config_path
.parent()
.map_or_else(|| PathBuf::from("."), PathBuf::from)
.join("logs")
};
let stderr_log = logs_dir.join("daemon.stderr.log");View on GitHub (pinned to 88bb9c8533)