From b9c587bf640373a58a57f642ee2d2f7035782608 Mon Sep 17 00:00:00 2001 From: robll-v1 <3922295484@qq.com> Date: Mon, 26 Jan 2026 16:56:20 +0800 Subject: [PATCH] Add SIGUSR1-triggered log rotation for MO file logs. --- cmd/mo-service/main.go | 8 ++++++++ pkg/logutil/internal.go | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/cmd/mo-service/main.go b/cmd/mo-service/main.go index 9407048c166e1..464444bb78785 100644 --- a/cmd/mo-service/main.go +++ b/cmd/mo-service/main.go @@ -149,6 +149,14 @@ func waitSignalToStop(stopper *stopper.Stopper, shutdownC chan struct{}) { sigchan := make(chan os.Signal, 1) signal.Notify(sigchan, syscall.SIGTERM, syscall.SIGINT) + rotateSig := make(chan os.Signal, 1) + signal.Notify(rotateSig, syscall.SIGUSR1) + go func() { + for range rotateSig { + logutil.Rotate() + } + }() + go saveProfilesLoop(sigchan) detail := "Starting shutdown..." diff --git a/pkg/logutil/internal.go b/pkg/logutil/internal.go index fd121ef5ed29a..2a3cc0d36449c 100644 --- a/pkg/logutil/internal.go +++ b/pkg/logutil/internal.go @@ -17,6 +17,7 @@ package logutil import ( "context" "os" + "sync" "sync/atomic" "time" @@ -52,12 +53,15 @@ func initMOLogger(cfg *LogConfig) (*zap.Logger, error) { var _globalLogger atomic.Value var _skip1Logger atomic.Value var _errorLogger atomic.Value +var _fileLogger atomic.Value +var _fileLoggerMu sync.Mutex // init initializes a default zap logger before set up logger. func init() { SetLogReporter(&TraceReporter{noopReportZap, noopContextField}) conf := GetDefaultConfig() setGlobalLogConfig(&conf) + _fileLogger.Store((*lumberjack.Logger)(nil)) logger, _ := initMOLogger(&conf) replaceGlobalLogger(logger) } @@ -103,6 +107,7 @@ type LogConfig struct { func (cfg *LogConfig) getSyncer() zapcore.WriteSyncer { if cfg.Filename == "" || cfg.Filename == "console" { + setFileLogger(nil) return getConsoleSyncer() } @@ -116,14 +121,16 @@ func (cfg *LogConfig) getSyncer() zapcore.WriteSyncer { cfg.MaxSize = 512 } // add lumberjack logger - return zapcore.AddSync(&lumberjack.Logger{ + logger := &lumberjack.Logger{ Filename: cfg.Filename, MaxSize: cfg.MaxSize, MaxAge: cfg.MaxDays, MaxBackups: cfg.MaxBackups, LocalTime: true, Compress: false, - }) + } + setFileLogger(logger) + return zapcore.AddSync(logger) } func (cfg *LogConfig) getEncoder() zapcore.Encoder { @@ -203,3 +210,26 @@ func getConsoleSyncer() zapcore.WriteSyncer { } return syncer } + +func setFileLogger(logger *lumberjack.Logger) { + _fileLoggerMu.Lock() + defer _fileLoggerMu.Unlock() + _fileLogger.Store(logger) +} + +func Rotate() { + if !EnableLog() { + Info("log.rotate.skip", zap.String("reason", "log disabled")) + return + } + logger := _fileLogger.Load().(*lumberjack.Logger) + if logger == nil { + Info("log.rotate.skip", zap.String("reason", "no file logger configured")) + return + } + if err := logger.Rotate(); err != nil { + Warn("log.rotate.failed", zap.Error(err)) + return + } + Info("log.rotate.done") +}