允许不同级别的写入info

This commit is contained in:
yun
2026-10-05 19:30:40 +08:00
parent 7e1b474823
commit a9adc11fad
6 changed files with 600 additions and 32 deletions
+26 -1
View File
@@ -32,7 +32,7 @@ log := loggerx.NewLogger(ctx,
loggerx.SetMinLevel(loggerx.LevelInfo), // 最低输出级别,默认 LevelDebug(全输出)
loggerx.SetErrorHandler(onLogError), // 日志库自身故障回调(磁盘满/句柄失效等)
loggerx.SetTraceField("trace_id"), // trace 字段名,默认 trace_id
loggerx.SetErrorToInfo(), // error 是否同时写入 info 日志
loggerx.SetAllLevelToInfo(), // debug/warn/error 是否同时写入 info 日志
loggerx.SetExpandData("app", "order"), // 每条日志追加固定字段
loggerx.SetExtraDriver(f, hooks), // 额外落盘驱动(实现 io.Writer 即可)
loggerx.SetPrintFile(false), // 不写文件,只走驱动
@@ -172,6 +172,31 @@ loggerx.SetMinLevel(loggerx.LevelInfo) // 生产常用:Debug 直接丢弃,
loggerx.SetMinLevel(loggerx.LevelOff) // 全关
```
### 全量日志汇总到一个文件(SetAllLevelToInfo)
开启后,除 `info` 以外的所有级别(`debug` / `warn` / `error`)都会额外往同一个 channel 的
`info` 日志里再写一份,`info.log` 就是「一个文件看全量」的汇总文件:
```go
log := loggerx.NewLogger(ctx, loggerx.SetDir("./log"), loggerx.SetAllLevelToInfo())
log.Info(ctx, "只进 info.log")
log.Warn(ctx, "进 warn.log,同时进 info.log")
log.Error(ctx, "进 error.log,同时进 info.log")
```
行为细节:
- **原级别文件照旧写**:`warn.log` / `error.log` 内容不变,`info.log` 里是副本
- **副本保留原始 level 字段**,因此在 `info.log` 里仍然能按级别区分和过滤(不会统一改写成 `info`)
- **`info` 本身不重复写**,`info.log` 里不会出现两行相同的 info
- **副本只落文件**,不会再走一遍额外驱动(`SetToConsole` / `SetExtraDriver`),控制台不会出现重复行
- **级别过滤优先**:被 `SetMinLevel` 丢弃的日志不会因为它出现在 `info.log` 里
- **`SetPrintFile(false)` 时该选项无意义**(没有文件可写)
- **代价**:`info.log` 体积约等于所有级别日志之和;异步模式下每条非 info 日志会多占一个
队列槽位(队列容量 1000,非 info 级别的有效缓冲因此减半)
- 按时间/大小切割、过期清理照常生效
### 把日志库自身的故障暴露出来
磁盘满、句柄失效、归档失败、刷盘超时这类问题默认只体现在返回值里,而调用方通常忽略返回值。