日志
运行时的日志写两处:给人看的一份打到标准输出,给程序读的一份按行写成 JSON 文件。两处都先打码再写:密钥、令牌、邮箱、用户目录不会落进日志。这一篇讲在哪、长什么样、怎么查、改日志的时候要注意什么。
在哪
| 写到哪 | 格式 | 谁读 |
|---|---|---|
| 标准输出 | 时间 级别 记录器: 消息,一行一条 |
从源码跑时的终端;桌面版把它收进最近 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):
- 按值:进程知道的每一个密钥值,原样出现就换掉。启动时把运行环境里的每一个密钥(桌面版从系统钥匙串注入的也在里面)登记进去(
main.register_environment_secrets),网页后台里新存的密钥也随存随登记; - 按形状:带标签的(
token=…、Authorization: Bearer …、Cookie: …)、Discord 令牌、webhook 地址、各家模型服务的密钥、邮箱(只留首字母和域名)、用户目录(换成~)。
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)。
写日志的规矩
- 记事实和读数,用
键=值的形式(persona=%s channel=%s pause=%.1f),终端控制台和你的grep都靠它。 - 用占位符(
log.info("… persona=%s", persona_id)),不要先拼好字符串:打码在格式化之后做,两种写法都会被打码,但占位符在级别不够时根本不格式化。 - 出错用
log.exception或带exc_info=True,不要吞掉:「没回」「没发出去」要在日志里有一行说为什么。 - 不打聊天原文、记忆正文、模型的完整提示词:日志要能整份交给别人看,诊断包也会带上它。
- 改了一种日志的措辞,同步改
src/aeria/terminal/parse.py的RULES(按正则认日志,一百多条):认不出来的行控制台照样显示,但会变成暗色的「不认识」,WARNING 以上的会被当成告警。tests/test_terminal_parse.py里有每种格式的样例。
对应的代码
src/aeria/logging_setup.py(configure_logging、JsonLogFormatter);打码src/aeria_identity/log_redaction.py(RedactingFilter、redact_log_text、register_secret、quiet_noisy_loggers)。- 运行环境:
src/aeria/config.py的Environment(log_level、log_path、log_max_bytes= 10485760、log_backup_count= 5),样例.env.example。 - 桌面版:
desktop/src-tauri/src/runtime.rs(LOG_LINES= 2000)、commands.rs的diagnostics_preview、diagnostics_save。 - 测试:
tests/test_terminal_parse.py(「每种生产日志格式都认得出来_字段也抽得对」「原始文本先脱敏」)。
没做到的
- 日志一半中文一半英文:老的几处还是英文,没统一。
- 没有按人格分文件:几个人格写在同一个文件里,靠消息里的
persona=区分;有些行没带。 - 日志只在本机,没有集中收集,也没有指标看板。