Skip to content

Commit

Permalink
fix file truncate issue
Browse files Browse the repository at this point in the history
  • Loading branch information
absolutelightning committed Aug 31, 2023
1 parent 898bd1e commit 72685db
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 3 deletions.
11 changes: 8 additions & 3 deletions logging/logfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,19 +60,24 @@ func (l *LogFile) fileNamePattern() string {
}

func (l *LogFile) openNew() error {
createTime := now()
newfileName := l.fileName
newfilePath := filepath.Join(l.logPath, newfileName)

// Try creating a file. We truncate the file because we are the only authority to write the logs
// Try creating or opening the active log file. Since the active log file
// always has the same name, append log entries to prevent overwriting
// previous log data.
filePointer, err := os.OpenFile(newfilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0640)
if err != nil {
return err
}

l.FileInfo = filePointer
stat, err := filePointer.Stat()
if err != nil {
return err
}
// New file, new bytes tracker, new creation time :)
l.LastCreated = createTime
l.LastCreated = l.createTime(stat)
l.BytesWritten = 0
return nil
}
Expand Down
16 changes: 16 additions & 0 deletions logging/logfile_bsd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//go:build darwin || freebsd || netbsd || openbsd
// +build darwin freebsd netbsd openbsd

package logging

import (
"os"
"syscall"
"time"
)

func (l *LogFile) createTime(stat os.FileInfo) time.Time {
stat_t := stat.Sys().(*syscall.Stat_t)
createTime := stat_t.Ctimespec
return time.Unix(createTime.Sec, createTime.Nsec)
}
17 changes: 17 additions & 0 deletions logging/logfile_linux.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//go:build dragonfly || linux || solaris
// +build dragonfly linux solaris

package logging

import (
"os"
"syscall"
"time"
)

func (l *LogFile) createTime(stat os.FileInfo) time.Time {
stat_t := stat.Sys().(*syscall.Stat_t)
createTime := stat_t.Ctim
// Sec and Nsec are int32 in 32-bit architectures.
return time.Unix(int64(createTime.Sec), int64(createTime.Nsec)) //nolint:unconvert
}
14 changes: 14 additions & 0 deletions logging/logfile_windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package logging

import (
"os"
"time"
)

func (l *LogFile) createTime(stat os.FileInfo) time.Time {
// Use `ModTime` as an approximation if the exact create time is not
// available.
// On Windows, the file create time is not updated after the active log
// rotates, so use `ModTime` as an approximation as well.
return stat.ModTime()
}

0 comments on commit 72685db

Please sign in to comment.