本地日志查询
查找 North Coder 本地后端、桌面壳和 CLI daemon 日志。
North Coder 运行时会在本机写入多类日志。排障时可以先按问题类型选择日志:
- 后端、API、agent、数据库、WebSocket、工具调用和模型调用链路问题优先看
backend.log; - 桌面启动和后端拉起问题优先看
tauri.log,再看server-startup_*.log或其他server-*.log,最后看backend.log。; - daemon 启动失败或 health check 超时看
server-*.log。
本地日志分类
North Coder 主要有三类本地日志。
| 日志 | 用途 | 常见场景 |
|---|---|---|
backend.log | Python / FastAPI / NexAU 侧写出的结构化 JSON 日志。 | 排查 API、agent、数据库、WebSocket、工具调用、模型调用链路。 |
tauri.log | Tauri / Rust 桌面壳日志。 | 桌面应用打不开、后端没被拉起、端口复用异常、停止后端异常。 |
server-*.log | ncoder server start 或桌面端通过 CLI lifecycle 拉起后端 daemon 时重定向的 stdout / stderr。 | daemon 启动失败、health check 超时、server 进程异常退出。 |
server-*.log 的实际路径也会写进 ~/.north-coder/server.json 或 ~/.north-coder/server-dev.json 的 log_path 字段。
backend.log 的日期目录按 UTC 日期生成,tauri.log 按本地日期生成。
macOS
后端业务日志:
~/Library/Logs/North Coder/<日期>/backend.log桌面壳日志:
~/Library/Logs/North Coder/<日期>/tauri.logCLI daemon 日志:
~/.north-coder/logs/server-*.logLinux
后端业务日志:
~/.local/state/north-coder/logs/<日期>/backend.log桌面壳日志当前实现写在:
~/Library/Logs/North Coder/<日期>/tauri.log这个路径看起来偏 macOS,但当前代码里 Linux 也走了这个非 Windows 分支。
CLI daemon 日志:
~/.north-coder/logs/server-*.logWindows
后端业务日志:
%LOCALAPPDATA%\North Coder\Logs\<日期>\backend.log桌面壳日志:
%LOCALAPPDATA%\North Coder\Logs\<日期>\tauri.logCLI daemon 日志:
%USERPROFILE%\.north-coder\logs\server-*.log打包 WSL 和 Windows 日志
下面的 PowerShell 脚本会将 WSL 中的 North Coder 日志和 Windows North Coder 日志打包到桌面压缩包。输出文件名类似 north-coder-wsl-logs-20260520-153000.tar.gz。
直接整段复制到 PowerShell 中运行即可:
$Distro = ""
$OutDir = [Environment]::GetFolderPath("Desktop")
$ErrorActionPreference = "Stop"
$wsl = @()
if ($Distro) { $wsl = @("-d", $Distro) }
$outWsl = (& wsl.exe @wsl -- wslpath -a "$OutDir").Trim()
$name = "north-coder-wsl-logs-$(Get-Date -Format 'yyyyMMdd-HHmmss').tar.gz"
$script = @'
set -eu
out="$1"
name="$2"
tmp="$(mktemp -d)"
trap 'rm -rf "$tmp"' EXIT
root="$tmp/north-coder-logs"
mkdir -p "$root/metadata"
copy_if_exists() {
[ -e "$1" ] && mkdir -p "$(dirname "$root/$2")" && cp -a "$1" "$root/$2" || true
}
redact_if_exists() {
[ -f "$1" ] || return 0
sed -E 's/("(api_token|admin_token|token|secret|password|access_key|api_key)"[[:space:]]*:[[:space:]]*")[^"]*(")/\1<redacted>\3/Ig' "$1" > "$root/metadata/$(basename "$1")"
}
copy_if_exists "$HOME/.local/state/north-coder/logs" "backend-logs"
copy_if_exists "$HOME/.north-coder/logs" "daemon-logs"
copy_if_exists "$HOME/Library/Logs/North Coder" "tauri-logs"
redact_if_exists "$HOME/.north-coder/server.json"
redact_if_exists "$HOME/.north-coder/server-dev.json"
{
echo "Generated: $(date -Is 2>/dev/null || date)"
echo "WSL: $(uname -a)"
echo "HOME: $HOME"
command -v ncoder >/dev/null 2>&1 && ncoder server status --verbose 2>&1 || true
} > "$root/diagnostics.txt"
mkdir -p "$out"
tar -C "$tmp" -czf "$out/$name" north-coder-logs
echo "$out/$name"
'@
$result = $script | & wsl.exe @wsl -- bash -s -- "$outWsl" "$name"
if ($LASTEXITCODE -ne 0) { throw "Collect failed: $result" }
Write-Host "Created: $(Join-Path $OutDir $name)"