diff --git a/CHANGELOG.md b/CHANGELOG.md index ad007d1..c6541cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [1.5.2] - 2026-06-04 +- **稳定性修复: 异步引擎平滑退出**: + - **修复**: 重构 `writerService` 的通道生命周期管理。在 `Start` 时重新初始化 `LogChannel` 与 `StopChan`,并改用 `chan struct{}` 替代 `chan bool`,彻底解决了在 `starter` 多次启停或服务退出时引发的 `panic: close of closed channel` 致命错误。 + ## [1.5.1] - 2026-06-04 - **缺陷修复: 异步控制台日志丢失**: - **修复**: 在 `writerService.processLog` 中补充了默认的回退逻辑。当处于异步 `starter` 运行模式下,且日志的 `writer` 和 `file` 都为 `nil`(即未配置特定的输出目标,本应输出到控制台)时,不再静默丢弃该日志,而是默认回退调用 `fmt.Println` 并在控制台打印渲染后的视图。 diff --git a/default_logger.go b/default_logger.go index 00d1f5c..93cc0f0 100644 --- a/default_logger.go +++ b/default_logger.go @@ -13,6 +13,7 @@ func init() { var conf Config _ = config.Load(&conf, "log") DefaultLogger = NewLogger(conf) + DefaultLogger.RedirectStdLog() } // New 创建带有 traceId 的 Logger 副本 diff --git a/logger.go b/logger.go index 0cc75b9..b224114 100644 --- a/logger.go +++ b/logger.go @@ -2,6 +2,7 @@ package log import ( "fmt" + "io" "log" "os" "strings" @@ -11,6 +12,31 @@ import ( "apigo.cc/go/id" ) +// logRedirectWriter 捕获标准 log 包的输出并转发到 structured logger +type logRedirectWriter struct { + logger *Logger +} + +func (w *logRedirectWriter) Write(p []byte) (n int, err error) { + msg := strings.TrimSpace(string(p)) + if msg != "" { + w.logger.Info(msg) + } + return len(p), nil +} + +// RedirectStdLog 将标准 log 包的输出重定向到当前 Logger。 +// 注意:这会全局修改标准 log 包的配置。 +func (logger *Logger) RedirectStdLog() { + log.SetOutput(&logRedirectWriter{logger: logger}) + log.SetFlags(0) // 禁用标准 log 的时间前缀,由我们的 logger 统一处理 +} + +// SetStdLogOutput 仅设置输出目标而不修改 Flags +func SetStdLogOutput(w io.Writer) { + log.SetOutput(w) +} + type Logger struct { config Config level LevelType