From e2a485dfe6a27ae70e72f6ea510c620a8ee1860d Mon Sep 17 00:00:00 2001 From: guke Date: Sun, 19 Jul 2026 10:07:08 +0800 Subject: [PATCH] =?UTF-8?q?docs(applog):=20spec/plan=20=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E4=BD=93=E4=B8=8A=E9=99=90=E5=90=8C=E6=AD=A5=E4=B8=BA=202MB(?= =?UTF-8?q?=E4=B8=8E=E7=AB=AF=E7=82=B9=E9=BB=98=E8=AE=A4=E4=B8=80=E8=87=B4?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/superpowers/plans/2026-07-19-client-applog-ingest.md | 4 ++-- .../specs/2026-07-19-client-applog-ingest-design.md | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/superpowers/plans/2026-07-19-client-applog-ingest.md b/docs/superpowers/plans/2026-07-19-client-applog-ingest.md index cb26eb0..6f915d1 100644 --- a/docs/superpowers/plans/2026-07-19-client-applog-ingest.md +++ b/docs/superpowers/plans/2026-07-19-client-applog-ingest.md @@ -452,7 +452,7 @@ def _client_ip(request: Request) -> str: def _enforce_body_limit(request: Request) -> None: """依赖:body 声明过大直接 413(在 body 校验前拦截)。缺 Content-Length 由 nginx 兜底。""" - max_bytes = int(os.getenv("APPLOG_MAX_BODY_BYTES", str(1024 * 1024))) + max_bytes = int(os.getenv("APPLOG_MAX_BODY_BYTES", str(1024 * 1024 * 2))) cl = request.headers.get("content-length") if cl is not None and cl.isdigit() and int(cl) > max_bytes: raise HTTPException(status_code=413, detail="日志批量过大") @@ -532,7 +532,7 @@ git commit -m "feat(applog): POST /api/v1/applog/batch 批量上报端点(限流 # CLIENT_LOG_BACKUP_COUNT=10 # 保留 10 个 → ~200MB 缓冲 # CLIENT_LOG_SERVICE_NAME=app-client # 输出行 service 字段 # APPLOG_MAX_BATCH=500 # 单批最大条数(超 → 422) -# APPLOG_MAX_BODY_BYTES=1048576 # 请求体上限 1MB(超 → 413) +# APPLOG_MAX_BODY_BYTES=2097152 # 请求体上限 2MB(超 → 413) # APPLOG_MAX_MSG_BYTES=8192 # 单条 msg 超限截断 ``` diff --git a/docs/superpowers/specs/2026-07-19-client-applog-ingest-design.md b/docs/superpowers/specs/2026-07-19-client-applog-ingest-design.md index 479d27f..26d02e8 100644 --- a/docs/superpowers/specs/2026-07-19-client-applog-ingest-design.md +++ b/docs/superpowers/specs/2026-07-19-client-applog-ingest-design.md @@ -68,7 +68,7 @@ Android 客户端会在本地攒一批 App 运行日志(自动化步骤 / 网 | 限额 | 默认 | 超限行为 | env | |---|---|---|---| | 单批条数 | 500 | 422(Pydantic) | `APPLOG_MAX_BATCH` | -| body 字节 | 1 MB | 413(依赖查 `Content-Length`,在 body 校验前拦截;缺该头由 nginx `client_max_body_size` 兜底) | `APPLOG_MAX_BODY_BYTES` | +| body 字节 | 2 MB | 413(依赖查 `Content-Length`,在 body 校验前拦截;缺该头由 nginx `client_max_body_size` 兜底) | `APPLOG_MAX_BODY_BYTES` | | 单条 `msg` 字节 | 8192 | 截断 + 标记,不丢 | `APPLOG_MAX_MSG_BYTES` | 同时**对齐 nginx `client_max_body_size`**(见 [deploy/nginx](../../../deploy/nginx/))避免反代先于应用截断。限流复用 `app/core/ratelimit.py`(项目现有 IP 固定窗口);具体挂法参照现有已限流写端点,测试环境 `RATE_LIMIT_ENABLED=false` 关闭。 @@ -154,7 +154,7 @@ Android 客户端会在本地攒一批 App 运行日志(自动化步骤 / 网 1. 每条日志结构:顶层放 `client_ts / level / trace_id? / tag? / msg`,其余自定义字段放 `data`(否则会被服务端兜底挪进 `data`)。 2. 有服务端交互的日志带上对应 `trace_id`。 3. 等级/采样与 PII 控制在客户端侧做(省流量、免服务端脱敏)。 -4. 单批 ≤500 条、body ≤1MB;失败可重试(服务端接受重复)。 +4. 单批 ≤500 条、body ≤2MB;失败可重试(服务端接受重复)。 ## 11. 代码落点 @@ -174,7 +174,7 @@ Android 客户端会在本地攒一批 App 运行日志(自动化步骤 / 网 3. **未知键兜底**:记录带 `foo` → 输出行顶层无 `foo`,`data.foo` 存在。 4. **msg 截断**:`msg` > 8KB → 截断+标记,仍 `received`(不进 dropped)。 5. **超批拒绝**:>500 条 → 422。 -6. **超体积拒绝**:`Content-Length` > 1MB → 413。 +6. **超体积拒绝**:`Content-Length` > 2MB → 413。 7. **写失败不 500**:monkeypatch writer 抛错 → 仍 2xx。 8. **不污染服务日志**:`client` logger `propagate=False`,写客户端日志不落 `app-server.log`。 @@ -187,7 +187,7 @@ Android 客户端会在本地攒一批 App 运行日志(自动化步骤 / 网 | `CLIENT_LOG_BACKUP_COUNT` | `10` | 保留滚动文件数 | | `CLIENT_LOG_SERVICE_NAME` | `app-client` | 输出行 `service` 字段 | | `APPLOG_MAX_BATCH` | `500` | 单批最大条数 | -| `APPLOG_MAX_BODY_BYTES` | `1048576`(1MB) | 请求体上限 | +| `APPLOG_MAX_BODY_BYTES` | `2097152`(2MB) | 请求体上限 | | `APPLOG_MAX_MSG_BYTES` | `8192` | 单条 msg 截断阈值 | 滚动/文件类 env 在 `client_log.py` 用 `os.getenv` 读取(与 [logging.py](../../../app/core/logging.py) 风格一致);请求限额类同样以 `os.getenv` 兜默认。