snippetgoCritical
How to write log to file
Viewed 0 times
writefilehowlog
Problem
I'm trying to write to a log file with Go.
I have tried several approaches, all of which have failed. This is what I have tried:
The log file gets created, but nothing ever gets printed or appended to it. Why?
I have tried several approaches, all of which have failed. This is what I have tried:
func TestLogging(t *testing.T) {
if !FileExists("logfile") {
CreateFile("logfile")
}
f, err := os.Open("logfile")
if err != nil {
t.Fatalf("error: %v", err)
}
// attempt #1
log.SetOutput(io.MultiWriter(os.Stderr, f))
log.Println("hello, logfile")
// attempt #2
log.SetOutput(io.Writer(f))
log.Println("hello, logfile")
// attempt #3
log.SetOutput(f)
log.Println("hello, logfile")
}
func FileExists(name string) bool {
if _, err := os.Stat(name); err != nil {
if os.IsNotExist(err) {
return false
}
}
return true
}
func CreateFile(name string) error {
fo, err := os.Create(name)
if err != nil {
return err
}
defer func() {
fo.Close()
}()
return nil
}The log file gets created, but nothing ever gets printed or appended to it. Why?
Solution
os.Open() must have worked differently in the past, but this works for me:f, err := os.OpenFile("testlogfile", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666)
if err != nil {
log.Fatalf("error opening file: %v", err)
}
defer f.Close()
log.SetOutput(f)
log.Println("This is a test log entry")Based on the Go docs,
os.Open() can't work for log.SetOutput, because it opens the file "for reading:"func Openfunc Open(name string) (file *File, err error) Open opens the namedfile for reading. If successful, methods on the returned file can be
used for reading; the associated file descriptor has mode
O_RDONLY. Ifthere is an error, it will be of type
*PathError.EDIT
Moved
defer f.Close() to after if err != nil checkCode Snippets
f, err := os.OpenFile("testlogfile", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666)
if err != nil {
log.Fatalf("error opening file: %v", err)
}
defer f.Close()
log.SetOutput(f)
log.Println("This is a test log entry")Context
Stack Overflow Q#19965795, score: 231
Revisions (0)
No revisions yet.