docs(db): update README for log_client SDK template and hardening features
- Document that example_log_client.py now uses RpcClient (high-level RPC) instead of legacy MsgClient (low-level TCP frames) - Add comprehensive client feature list reflecting all hardening fixes: - Thread exception protection (outer try/except prevents thread death) - Accurate enqueue-time timestamps - Queue maxsize with drop-oldest policy - Safe JSON serialization fallback - Event-based flush synchronization - Non-blocking push() guarantee - Clarify length truncation: server-side _log_internal() truncates internal logs to 8KB/4KB, external clients should control length - Add db_tools.py to file table (was previously undocumented) - Update service description to mention RpcServer
This commit is contained in:
1 parent
bdbea6ac40
commit
6c587a22d8
1 file changed
+12
-6
+12
-6
@@ -189,7 +189,7 @@ CREATE TABLE IF NOT EXISTS Logs (
|
|||||||
|
|
||||||
### 写入方式
|
### 写入方式
|
||||||
|
|
||||||
**外部服务**:复制 `example_log_client.py` 为各自目录下的 `log_client.py`,改 `service_name` 即用。客户端底层通过 pymsg 调 `execute` 路由逐条 INSERT 到 Logs 表:
|
**外部服务**:复制 `example_log_client.py` 为各自目录下的 `log_client.py`,改 `service_name` 即用。客户端底层通过 pymsg `RpcClient`(高层 RPC 封装)调 `execute` 路由逐条 INSERT 到 Logs 表:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from log_client import logs
|
from log_client import logs
|
||||||
@@ -202,11 +202,16 @@ logs.push("gateway", "WARNING", "登录失败次数超限",
|
|||||||
|
|
||||||
客户端特性:
|
客户端特性:
|
||||||
- 无第三方依赖(仅依赖 pymsg 项目内置库),异步非阻塞:内存队列 + 后台线程批量推送
|
- 无第三方依赖(仅依赖 pymsg 项目内置库),异步非阻塞:内存队列 + 后台线程批量推送
|
||||||
- fail-safe:db 不可用时静默丢弃,绝不影响业务
|
- **RpcClient 高层 RPC**:直接传 dict 对象,无需手动拼 `_route` / json.dumps / json.loads
|
||||||
|
- fail-safe:db 不可用时静默丢弃,绝不影响业务;后台线程外层 try/except 捕获所有异常,任何网络/序列化错误都不会杀死日志线程(防止队列无限增长导致 OOM)
|
||||||
- 缓冲批量:队列满 50 条或超时 2 秒时自动 flush
|
- 缓冲批量:队列满 50 条或超时 2 秒时自动 flush
|
||||||
- 长度保护:`message` 上限 8192 字节、`extra` 上限 4096 字节,超长自动截断
|
- 时间戳准确:日志入队时即生成 UTC ISO 时间戳,而非发送时生成,队列积压时时间仍反映事件真实发生时间
|
||||||
|
- 队列保护:队列上限 10000 条,满时丢弃最旧条目(drop-oldest),`push()` 永远不阻塞业务线程
|
||||||
|
- 安全序列化:`extra` 字段包含不可 JSON 序列化对象时自动 fallback 为 `str()`/`repr()`,不会因 TypeError 中断
|
||||||
|
- flush 可靠:`flush()` 使用 Event 通知而非固定 sleep,精确等待后台线程完成批量发送
|
||||||
|
- 长度保护:服务端 `_log_internal()` 对内部日志有 `message` 上限 8192 字节、`extra` 上限 4096 字节的自动截断;外部客户端建议在业务层控制日志长度
|
||||||
|
|
||||||
**db 自身**:`_log_internal()` 直接写库,无网络往返(防递归)。
|
**db 自身**:`_log_internal()` 直接写库,无网络往返(防递归),并在写入前做长度截断。
|
||||||
|
|
||||||
### 查询日志
|
### 查询日志
|
||||||
|
|
||||||
@@ -239,8 +244,9 @@ SQLAlchemy 会自动生成适配各数据库的 SQL 方言,无需修改接口
|
|||||||
|
|
||||||
| 文件 | 说明 |
|
| 文件 | 说明 |
|
||||||
|------|------|
|
|------|------|
|
||||||
| `dbv2.py` | 服务主程序(pymsg/TCP,唯一在跑的实现) |
|
| `dbv2.py` | 服务主程序(pymsg RpcServer/TCP,唯一在跑的实现) |
|
||||||
| `example_log_client.py` | 日志客户端 SDK 模板,各服务复制为 `log_client.py` 使用 |
|
| `example_log_client.py` | 日志客户端 SDK 模板,各服务复制为 `log_client.py` 使用(基于 RpcClient,含线程保护/队列上限/安全序列化等健壮性设计) |
|
||||||
|
| `db_tools.py` | SQLite 运维工具:backup / export / import / vacuum / wal-checkpoint / info,供 docker.sh 等脚本调用 |
|
||||||
| `create_sqlite3.sql` | Users / Notes / Logs 建表脚本 |
|
| `create_sqlite3.sql` | Users / Notes / Logs 建表脚本 |
|
||||||
| `_view_db.sqlite3.py` | 非交互式查看 database.db 的工具脚本 |
|
| `_view_db.sqlite3.py` | 非交互式查看 database.db 的工具脚本 |
|
||||||
| `_set.sh` / `_run.sh` | 环境安装 / 启动脚本 |
|
| `_set.sh` / `_run.sh` | 环境安装 / 启动脚本 |
|
||||||
Reference in new issue
Block a user