Skip to content

Commit 3943f66

Browse files
committed
feat(logger): add size-based log rotation support
1 parent 91111cf commit 3943f66

File tree

5 files changed

+83
-31
lines changed

5 files changed

+83
-31
lines changed

app.example.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ DB = 0
2727
Prefix = cosy
2828

2929
[log]
30+
EnableRotate = true
3031
EnableFileLog = false
3132
Dir = logs
3233
MaxSize = 10

docs/logger/start.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,11 @@ func initDB() *gorm.DB {
8989

9090
## 日志文件配置
9191

92-
Logger 支持日志文件轮转功能,可通过以下配置启用
92+
Logger 支持日志文件轮转功能,可通过以下配置启用或关闭
9393

9494
```ini
9595
[log]
96+
EnableRotate = true
9697
EnableFileLog = true
9798
Dir = logs
9899
MaxSize = 100
@@ -103,6 +104,7 @@ Compress = true
103104

104105
配置参数说明:
105106

107+
- `EnableRotate`: 是否启用按大小轮转,默认 true;关闭后日志文件仅追加不会分片
106108
- `EnableFileLog`: 是否启用文件日志(默认:false)
107109
- `Dir`: 日志文件存储目录
108110
- `MaxSize`: 单个日志文件最大体积,单位 MB(默认:100 MB)

logger/file.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package logger
22

33
import (
4+
"fmt"
5+
"os"
6+
"path/filepath"
47
"time"
58

69
"github.com/gin-gonic/gin"
10+
"github.com/uozi-tech/cosy/settings"
711
"go.uber.org/zap/zapcore"
12+
"gopkg.in/natefinch/lumberjack.v2"
813
)
914

1015
func GetFileEncoder(mode string) zapcore.Encoder {
@@ -31,3 +36,66 @@ func GetFileEncoder(mode string) zapcore.Encoder {
3136

3237
return zapcore.NewJSONEncoder(encoderConfig)
3338
}
39+
40+
// NewFileCores builds zap cores with size-based log rotation.
41+
// Error and above go to error.log; lower levels go to info.log.
42+
func NewFileCores(mode string, highPriority, lowPriority zapcore.LevelEnabler) ([]zapcore.Core, error) {
43+
if err := os.MkdirAll(settings.LogSettings.Dir, 0755); err != nil {
44+
return nil, fmt.Errorf("create log directory: %w", err)
45+
}
46+
47+
encoder := GetFileEncoder(mode)
48+
49+
var (
50+
errorSyncer zapcore.WriteSyncer
51+
infoSyncer zapcore.WriteSyncer
52+
err error
53+
)
54+
55+
if settings.LogSettings.EnableRotate {
56+
errorSyncer = newRotateWriteSyncer(filepath.Join(settings.LogSettings.Dir, "error.log"))
57+
infoSyncer = newRotateWriteSyncer(filepath.Join(settings.LogSettings.Dir, "info.log"))
58+
} else {
59+
errorSyncer, err = newPlainWriteSyncer(filepath.Join(settings.LogSettings.Dir, "error.log"))
60+
if err != nil {
61+
return nil, fmt.Errorf("open error log file: %w", err)
62+
}
63+
infoSyncer, err = newPlainWriteSyncer(filepath.Join(settings.LogSettings.Dir, "info.log"))
64+
if err != nil {
65+
return nil, fmt.Errorf("open info log file: %w", err)
66+
}
67+
}
68+
69+
errorCore := zapcore.NewCore(
70+
encoder,
71+
errorSyncer,
72+
highPriority,
73+
)
74+
75+
infoCore := zapcore.NewCore(
76+
encoder,
77+
infoSyncer,
78+
lowPriority,
79+
)
80+
81+
return []zapcore.Core{errorCore, infoCore}, nil
82+
}
83+
84+
func newRotateWriteSyncer(filename string) zapcore.WriteSyncer {
85+
return zapcore.AddSync(&lumberjack.Logger{
86+
Filename: filename,
87+
MaxSize: settings.LogSettings.MaxSize,
88+
MaxBackups: settings.LogSettings.MaxBackups,
89+
MaxAge: settings.LogSettings.MaxAge,
90+
LocalTime: true,
91+
Compress: settings.LogSettings.Compress,
92+
})
93+
}
94+
95+
func newPlainWriteSyncer(filename string) (zapcore.WriteSyncer, error) {
96+
f, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o644)
97+
if err != nil {
98+
return nil, err
99+
}
100+
return zapcore.AddSync(f), nil
101+
}

logger/logger.go

Lines changed: 4 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@ package logger
33
import (
44
"log"
55
"os"
6-
"path/filepath"
76
"time"
87

98
"github.com/gin-gonic/gin"
109
"github.com/uozi-tech/cosy/settings"
1110
"go.uber.org/zap"
1211
"go.uber.org/zap/zapcore"
13-
"gopkg.in/natefinch/lumberjack.v2"
1412
)
1513

1614
var logger *zap.SugaredLogger
@@ -109,34 +107,11 @@ func Init(mode string) {
109107
}
110108

111109
if settings.LogSettings.EnableFileLog {
112-
if err := os.MkdirAll(settings.LogSettings.Dir, 0755); err != nil {
113-
log.Fatal(err)
110+
fileCores, err := NewFileCores(mode, highPriority, lowPriority)
111+
if err != nil {
112+
log.Fatalf("init file logger: %v", err)
114113
}
115-
116-
errorLogWriter := &lumberjack.Logger{
117-
Filename: filepath.Join(settings.LogSettings.Dir, "error.log"),
118-
MaxSize: settings.LogSettings.MaxSize,
119-
MaxBackups: settings.LogSettings.MaxBackups,
120-
MaxAge: settings.LogSettings.MaxAge,
121-
LocalTime: true,
122-
Compress: settings.LogSettings.Compress,
123-
}
124-
125-
infoLogWriter := &lumberjack.Logger{
126-
Filename: filepath.Join(settings.LogSettings.Dir, "info.log"),
127-
MaxSize: settings.LogSettings.MaxSize,
128-
MaxBackups: settings.LogSettings.MaxBackups,
129-
MaxAge: settings.LogSettings.MaxAge,
130-
LocalTime: true,
131-
Compress: settings.LogSettings.Compress,
132-
}
133-
134-
fileEncoder := GetFileEncoder(mode)
135-
136-
cores = append(cores,
137-
zapcore.NewCore(fileEncoder, zapcore.AddSync(errorLogWriter), highPriority),
138-
zapcore.NewCore(fileEncoder, zapcore.AddSync(infoLogWriter), lowPriority),
139-
)
114+
cores = append(cores, fileCores...)
140115
}
141116

142117
// Initialize enhanced logger (console + file only)

settings/log.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package settings
22

33
type LogConfig struct {
4+
// EnableRotate controls whether to use size-based log rotation.
5+
// Default true to prevent unbounded growth.
6+
EnableRotate bool
7+
48
// EnableFileLog is a flag to enable file logging.
59
EnableFileLog bool
610

@@ -32,4 +36,6 @@ type LogConfig struct {
3236
Compress bool
3337
}
3438

35-
var LogSettings = &LogConfig{}
39+
var LogSettings = &LogConfig{
40+
EnableRotate: true,
41+
}

0 commit comments

Comments
 (0)