优化结构
This commit is contained in:
@@ -50,6 +50,9 @@ func (w *DailyWriter) Write(value []byte) (int, error) {
|
||||
defer w.mu.Unlock()
|
||||
date := time.Now().Format("2006-01-02")
|
||||
if w.file == nil || w.date != date {
|
||||
// Retention is enforced again when a long-lived writer rolls to a new day.
|
||||
// Running this only on rotation avoids a directory scan for every write.
|
||||
w.removeExpired()
|
||||
if w.file != nil {
|
||||
_ = w.file.Close()
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
package logging
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestDailyWriterCleansExpiredDirectoriesOnRotation(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
writer := NewDailyWriter(root, "application.log", 1)
|
||||
oldDate := time.Now().AddDate(0, 0, -3).Format("2006-01-02")
|
||||
oldDir := filepath.Join(root, oldDate)
|
||||
if err := os.MkdirAll(oldDir, 0o755); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
writer.date = "2000-01-01"
|
||||
if _, err := writer.Write([]byte("rotated\n")); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
_ = writer.Close()
|
||||
if _, err := os.Stat(oldDir); !os.IsNotExist(err) {
|
||||
t.Fatalf("expired directory still exists: err=%v", err)
|
||||
}
|
||||
}
|
||||
@@ -460,7 +460,7 @@ func safeModuleName(value string) string {
|
||||
}, value)
|
||||
}
|
||||
|
||||
// NewZapLogger adapts a Zap core to the slog logger used by Kratos v3.
|
||||
// newZapHandler adapts a Zap core to the slog handler used by Kratos v3.
|
||||
// The file layout remains compatible with the administration log viewer.
|
||||
func newZapHandler(root, filename string, options Options, errorSink *errorSinkState) (slog.Handler, func()) {
|
||||
file := NewDailyWriter(root, filename, options.RetentionDay)
|
||||
@@ -538,8 +538,3 @@ func NewReloadableZapLogger(root, filename string, options Options, attrs ...any
|
||||
logger := kratoslog.NewLogger(handler, kratoslog.WithExtractor(tracing.TraceAttrs)).With(attrs...)
|
||||
return logger, control
|
||||
}
|
||||
|
||||
func NewZapLogger(root, filename string, options Options, attrs ...any) (*slog.Logger, func()) {
|
||||
logger, control := NewReloadableZapLogger(root, filename, options, attrs...)
|
||||
return logger, control.Close
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user