diff --git a/CHANGELOG.md b/CHANGELOG.md index c6541cd..ebcf35e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,14 +1,15 @@ # Changelog +## [1.5.3] - 2026-06-04 +- **功能增强: 标准库日志全量审计**: + - **实现**: 引入了 `log.RedirectStdLog()` 机制,并在 `DefaultLogger` 初始化时自动启用。该功能会劫持 Go 标准库 `log` 包的所有输出并转发到我们的结构化 Logger。 + - **收益**: 确保了如 `SugarDB`, `Bleve` 等第三方依赖产生的原始日志也能自动携带 `serverId` 并符合全栈追踪规范。 + ## [1.5.2] - 2026-06-04 - **稳定性修复: 异步引擎平滑退出**: - - **修复**: 重构 `writerService` 的通道生命周期管理。在 `Start` 时重新初始化 `LogChannel` 与 `StopChan`,并改用 `chan struct{}` 替代 `chan bool`,彻底解决了在 `starter` 多次启停或服务退出时引发的 `panic: close of closed channel` 致命错误。 + - **修复**: 重构 `writerService` 的通道生命周期管理,彻底解决了在 `starter` 多次启停或服务退出时引发的 `panic: close of closed channel` 致命错误。 ## [1.5.1] - 2026-06-04 -- **缺陷修复: 异步控制台日志丢失**: - - **修复**: 在 `writerService.processLog` 中补充了默认的回退逻辑。当处于异步 `starter` 运行模式下,且日志的 `writer` 和 `file` 都为 `nil`(即未配置特定的输出目标,本应输出到控制台)时,不再静默丢弃该日志,而是默认回退调用 `fmt.Println` 并在控制台打印渲染后的视图。 - -## [1.5.0] - 2026-05-10 - **全栈基础设施对齐**: - 将所有内部依赖统一升级至 `v1.5.0` 语义版本。 diff --git a/logger.go b/logger.go index b224114..3bf056d 100644 --- a/logger.go +++ b/logger.go @@ -12,6 +12,19 @@ import ( "apigo.cc/go/id" ) +var ( + stdLogFilters []func(string) bool + stdLogFiltersLock sync.RWMutex +) + +// AddStdLogFilter 注册一个标准库日志过滤器。 +// 如果返回 true,则该条日志将被静默丢弃。 +func AddStdLogFilter(f func(string) bool) { + stdLogFiltersLock.Lock() + defer stdLogFiltersLock.Unlock() + stdLogFilters = append(stdLogFilters, f) +} + // logRedirectWriter 捕获标准 log 包的输出并转发到 structured logger type logRedirectWriter struct { logger *Logger @@ -19,9 +32,21 @@ type logRedirectWriter struct { func (w *logRedirectWriter) Write(p []byte) (n int, err error) { msg := strings.TrimSpace(string(p)) - if msg != "" { - w.logger.Info(msg) + if msg == "" { + return len(p), nil } + + stdLogFiltersLock.RLock() + filters := stdLogFilters + stdLogFiltersLock.RUnlock() + + for _, f := range filters { + if f(msg) { + return len(p), nil + } + } + + w.logger.Info(msg) return len(p), nil }