Created
August 3, 2015 07:58
-
-
Save didasy/ae05dea331baeea4fc46 to your computer and use it in GitHub Desktop.
Log rotater boilerplate for log.SetOutput
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import ( | |
"os" | |
"sync" | |
"time" | |
) | |
type RotateWriter struct { | |
lock sync.Mutex | |
filename string // should be set to the actual filename | |
fp *os.File | |
} | |
// Make a new RotateWriter. Return nil if error occurs during setup. | |
func New(filename string) *RotateWriter { | |
w := &RotateWriter{filename: filename} | |
err := w.Rotate() | |
if err != nil { | |
return nil | |
} | |
return w | |
} | |
// Write satisfies the io.Writer interface. | |
func (w *RotateWriter) Write(output []byte) (int, error) { | |
w.lock.Lock() | |
defer w.lock.Unlock() | |
return w.fp.Write(output) | |
} | |
// Perform the actual act of rotating and reopening file. | |
func (w *RotateWriter) Rotate() (err error) { | |
w.lock.Lock() | |
defer w.lock.Unlock() | |
// Close existing file if open | |
if w.fp != nil { | |
err = w.fp.Close() | |
w.fp = nil | |
if err != nil { | |
return | |
} | |
} | |
// Rename dest file if it already exists | |
_, err = os.Stat(w.filename) | |
if err == nil { | |
err = os.Rename(w.filename, w.filename+'.'+time.Now().Format(time.RFC3339)) | |
if err != nil { | |
return | |
} | |
} | |
// Create a file. | |
w.fp, err = os.Create(w.filename) | |
return | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment