in file/rotator.go [152:202]
func NewFileRotator(filename string, options ...RotatorOption) (*Rotator, error) {
r := &Rotator{
filename: filename,
extension: "ndjson",
maxSizeBytes: 10 * 1024 * 1024, // 10 MiB
maxBackups: 7,
permissions: 0600,
interval: 0,
rotateOnStartup: true,
clock: &realClock{},
}
for _, opt := range options {
opt(r)
}
if r.maxSizeBytes == 0 {
return nil, errors.New("file rotator max file size must be greater than 0")
}
if r.maxBackups > MaxBackupsLimit {
return nil, fmt.Errorf("file rotator max backups %d is greater than the limit of %v", r.maxBackups, MaxBackupsLimit)
}
if r.permissions > os.ModePerm {
return nil, fmt.Errorf("file rotator permissions mask of %o is invalid", r.permissions)
}
if r.interval != 0 && r.interval < time.Second {
return nil, errors.New("the minimum time interval for log rotation is 1 second")
}
r.rot = newDateRotater(r.log, filename, r.extension, r.clock)
shouldRotateOnStart := r.rotateOnStartup
if _, err := os.Stat(r.rot.ActiveFile()); os.IsNotExist(err) {
shouldRotateOnStart = false
}
r.triggers = newTriggers(shouldRotateOnStart, r.interval, r.maxSizeBytes, r.clock)
if r.log != nil {
r.log.Debugw("Initialized file rotator",
"filename", r.filename,
"extension", r.extension,
"max_size_bytes", r.maxSizeBytes,
"max_backups", r.maxBackups,
"permissions", r.permissions,
)
}
return r, nil
}