Skip to content
This repository has been archived by the owner on Dec 20, 2024. It is now read-only.

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 lowzj committed Feb 13, 2019
1 parent 95d2be5 commit 471a121
Showing 1 changed file with 32 additions and 23 deletions.
55 changes: 32 additions & 23 deletions dfdaemon/initializer/initializer.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ package initializer
import (
"flag"
"fmt"
"io"
"io/ioutil"
"os"
"os/exec"
Expand Down Expand Up @@ -101,32 +100,35 @@ 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 the output of log back to logFile when error be 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
}
if err := logFile.Truncate(stat.Size() - truncateSize); err != nil {
return err
}
if _, err := logFile.Seek(truncateSize, 0); err != nil {
return err
}
}

return nil
}

func initLogger() {
Expand All @@ -147,7 +149,14 @@ 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 {
log.Errorf("failed to rotate log %s: %v", logFile.Name(), err)
}
}
}(logFile)
}
}

Expand Down

0 comments on commit 471a121

Please sign in to comment.