North Coder

本地日志查询

查找 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.logPython / FastAPI / NexAU 侧写出的结构化 JSON 日志。排查 API、agent、数据库、WebSocket、工具调用、模型调用链路。
tauri.logTauri / Rust 桌面壳日志。桌面应用打不开、后端没被拉起、端口复用异常、停止后端异常。
server-*.logncoder server start 或桌面端通过 CLI lifecycle 拉起后端 daemon 时重定向的 stdout / stderr。daemon 启动失败、health check 超时、server 进程异常退出。

server-*.log 的实际路径也会写进 ~/.north-coder/server.json~/.north-coder/server-dev.jsonlog_path 字段。

backend.log 的日期目录按 UTC 日期生成,tauri.log 按本地日期生成。

macOS

后端业务日志:

~/Library/Logs/North Coder/<日期>/backend.log

桌面壳日志:

~/Library/Logs/North Coder/<日期>/tauri.log

CLI daemon 日志:

~/.north-coder/logs/server-*.log

Linux

后端业务日志:

~/.local/state/north-coder/logs/<日期>/backend.log

桌面壳日志当前实现写在:

~/Library/Logs/North Coder/<日期>/tauri.log

这个路径看起来偏 macOS,但当前代码里 Linux 也走了这个非 Windows 分支。

CLI daemon 日志:

~/.north-coder/logs/server-*.log

Windows

后端业务日志:

%LOCALAPPDATA%\North Coder\Logs\<日期>\backend.log

桌面壳日志:

%LOCALAPPDATA%\North Coder\Logs\<日期>\tauri.log

CLI 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)"

本页内容