Skip to content

Commit

Permalink
Fix rotating log makes dfdaemon.log file huge size
Browse files Browse the repository at this point in the history
When the size of dfdaemon.log file large than 20M,
the size of log file will continuous growth up.

Use Mmap to copy the file which need be truncated.

Related to issue:
dragonflyoss/dragonfly#364

Signed-off-by: godliness <[email protected]>
  • Loading branch information
godliness authored and Chao Ma committed Feb 2, 2019
1 parent f4734b3 commit 120a278
Showing 1 changed file with 29 additions and 23 deletions.
52 changes: 29 additions & 23 deletions dfdaemon/initializer/initializer.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package initializer

import (
"fmt"
"io"
"io/ioutil"
"os"
"os/exec"
Expand Down Expand Up @@ -102,32 +101,31 @@ func cleanLocalRepo(options *options.Options) {
}

// rotateLog truncates the logs file by a certain amount bytes.
func rotateLog(logFile *os.File, logFilePath string) {
func rotateLog(logFile *os.File) error {
stat, err := logFile.Stat()
if err != nil {
return err
}
logSizeLimit := int64(20 * 1024 * 1024)
for {
time.Sleep(time.Second * 60)
stat, err := os.Stat(logFilePath)
// if it exceeds the 20MB limitation
if stat.Size() > logSizeLimit {
log.SetOutput(ioutil.Discard)
// make sure set log output back to logFile when error raised.
defer log.SetOutput(logFile)
logFile.Sync()
truncateSize := logSizeLimit/2 - 1
mem, err := syscall.Mmap(int(logFile.Fd()), 0, int(stat.Size()), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED)
if err != nil {
log.Errorf("failed to stat %s: %s", logFilePath, err)
continue
return err
}
// if it exceeds the 20MB limitation
if stat.Size() > logSizeLimit {
log.SetOutput(ioutil.Discard)
logFile.Sync()
if transFile, err := os.Open(logFilePath); err == nil {
// move the pointer to be (end - 10MB)
transFile.Seek(-10*1024*1024, 2)
// move the pointer to head
logFile.Seek(0, 0)
count, _ := io.Copy(logFile, transFile)
logFile.Truncate(count)
log.SetOutput(logFile)
transFile.Close()
}
copy(mem[0:], mem[truncateSize:])
if err := syscall.Munmap(mem); err != nil {
return err
}
logFile.Truncate(stat.Size() - truncateSize)
logFile.Seek(truncateSize, 0)
}

return nil
}

func initLogger() {
Expand All @@ -148,7 +146,15 @@ func initLogger() {
if logFile, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644); err == nil {
logFile.Seek(0, 2)
log.SetOutput(logFile)
go rotateLog(logFile, logFilePath)
go func(logFile *os.File) {
ticker := time.NewTicker(60 * time.Second)
for range ticker.C {
if err := rotateLog(logFile); err != nil {
// write error log into os.Stderr directly to avoid writing to a broken log file.
fmt.Fprintf(os.Stderr, "failed to rotate log %s: %v\n", logFile.Name(), err)
}
}
}(logFile)
}
}

Expand Down

0 comments on commit 120a278

Please sign in to comment.