Aeria
GitHub
改 · 3.27

日志

最后核对 2026-10-08对应提交 4dc8009依据 logging_setup.py · log_redaction.py · parse.py · config.py · .env.example · runtime.rs · commands.rs

运行时的日志写两处:给人看的一份打到标准输出,给程序读的一份按行写成 JSON 文件。两处都先打码再写:密钥、令牌、邮箱、用户目录不会落进日志。这一篇讲在哪、长什么样、怎么查、改日志的时候要注意什么。

本页 6 节
  1. 在哪
  2. 打码
  3. 查
  4. 写日志的规矩
  5. 对应的代码
  6. 没做到的

在哪

写到哪 格式 谁读
标准输出 时间 级别 记录器: 消息,一行一条 从源码跑时的终端;桌面版把它收进最近 2000 行的缓冲,「日志」页显示的就是它
data/logs/aeria.jsonl 一行一个 JSON:time(UTC)、level、logger、message,出错时多一个 exception 终端控制台(3.6)、你自己查问题

文件写满 10 MB 换一个,留 5 个旧的。运行环境里的四项能改:LOG_LEVEL(默认 INFO)、LOG_PATH、LOG_MAX_BYTES、LOG_BACKUP_COUNT(3.21)。

打码

两处用的是同一个过滤器(aeria_identity.log_redaction):

aiosqlite 的日志一律压到 WARNING:它在 DEBUG 下会把每条 SQL 的参数(聊天、表单原文)打出来。

查

# 这次启动以来的错误
jq -r 'select(.level == "ERROR") | .time + "  " + .message' data/logs/aeria.jsonl

# 某个人格的主动联系(消息里带 persona=<人格 ID> 这样的键值)
grep '"impulse held persona=' data/logs/aeria.jsonl | tail -20

更顺手的是终端控制台:它把每一轮对话拼成一张卡片,--since 2h --raw 可以连原始日志行一起回放。用户那边要查问题,用桌面版「诊断」生成诊断包:带上最近 300 行日志(可以不带),生成之前先给他看要打包什么,打码以后存在他自己选的地方,不自动上传(1.25)。

写日志的规矩

对应的代码

没做到的