imbytecat
|
ce39faf778
|
refactor(logging): 接受 oracle 审计建议打磨三处不够极致的细节
1. configureSync 用 getConfig() === null 守卫幂等初始化。原写法
reset: true 在 ESM 缓存正常时多余、HMR 重复求值时会反复
resetSync() + 累积 process.on('exit') 监听器。
2. ['logtape','meta'] logger 加 parentSinks: 'override'。原配置
它既挂自己的 console sink、又继承 root sink,meta 的 warning/
error/fatal 会被打印两次。
3. DrizzleLogger 显式传 'info' level。原默认 'debug' 与 LOG_LEVEL
默认 'info' 形成隐形依赖:用户必须同时设两个变量才能看到 SQL。
现在 LOG_DB=true 单开关即生效,符合"开关即可用"审美。
附带:删除未消费的 export type { LogLevel };getLogger 改成直接
re-export from '@logtape/logtape',少一层本地 import 间接。
端到端验证(compose + Postgres 18-alpine):
- LOG_DB=true 默认 LOG_LEVEL=info 下 SQL 以 level=INFO logger=db 输出 ✓
- meta logger 不再重复 sink ✓
- typecheck / test 3/3 / build / compile 117M 全绿 ✓
Oracle 审计 ses_23c5090efffe1jzPR5fVVm1y6m,KISS 评分由 8/10 升至 9.2/10。
|
2026-04-25 16:14:30 +08:00 |
|
imbytecat
|
cc3a5dc5ad
|
feat(logging): 引入 LogTape 替换 console.* 为结构化日志
为什么选 LogTape(2026 实测):
- pino 在 bun build --compile 编译产物里因 worker_threads + 动态 require 在
/\$bunfs/ 虚拟文件系统中崩溃,与单二进制部署核心目标冲突;
- LogTape 零依赖(5.3KB)、零 worker、纯 ESM、原生 Bun 导出条件,runtime
agnostic,配合 configureSync 完美兼容 --bytecode 模式(无裸 top-level await);
- 一等公民集成:@logtape/drizzle-orm(SQL 查询日志)、@logtape/otel(后续
OpenTelemetry sink 留扩展点)。
变更:
- src/server/logger.ts: configureSync 引导 + getLogger 重导出。format 默认
process.stdout.isTTY ? pretty : json,可经 LOG_FORMAT 显式覆盖(绕开 Bun
bundler 把 process.env.NODE_ENV 在 --minify 时 inline 成字面量的特殊处理)。
- src/server/api/interceptors.ts: logError 改用 getLogger(['api']).error(...) +
结构化 properties,弃 logger.error 顶层 API。
- src/cli/migrate.ts: 所有 console.log 改走 getLogger(['cli','migrate']),logger
在 run() 内 lazy-import 以保持 citty subcommand 模块体 side-effect-free。
- src/server/db/index.ts: env.LOG_DB=true 时挂 DrizzleLogger 适配器,SQL 查询
按类别 ['db'] 在 debug 级输出(含 query/params/formattedQuery 三字段)。
新增 env 旋钮(t3-oss 校验):
- LOG_LEVEL: trace|debug|info|warning|error|fatal,默认 info
- LOG_FORMAT: pretty|json,默认 TTY 自动选
- LOG_DB: stringbool,默认 false
端到端验证(compose + Postgres 18-alpine):
- TTY 终端:pretty 输出含 ✨ 图标 + ANSI 彩色 + 类别·路径 ✓
- 管道/Docker:JSON Lines 一行一条,含 @timestamp/level/logger/properties ✓
- LOG_FORMAT=pretty 强制覆盖 ✓
- ./server migrate 应用 migration 并经 logger 输出 ✓
- ./server serve + RPC round-trip:interceptor logError 与 drizzle SQL 日志
在生产 JSON 模式下结构化输出 ✓
- fix / typecheck / test 3/3 / build / compile 117M 二进制全绿
|
2026-04-25 16:04:31 +08:00 |
|