我正在尝试使用 Go 写入日志文件。
我尝试了几种方法,但都失败了。这是我尝试过的:
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
}
创建了日志文件,但没有打印或附加任何内容。为什么?
最佳答案
os.Open()
过去的工作方式肯定有所不同,但这对我有用:
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")
根据 Go 文档,os.Open()
不能用于 log.SetOutput
,因为它会打开文件“用于读取:”
func Open
func Open(name string) (file *File, err error)
Open
opens the named file for reading. If successful, methods on the returned file can be used for reading; the associated file descriptor has modeO_RDONLY
. If there is an error, it will be of type*PathError
.
编辑
将 defer f.Close()
移到 if err != nil
检查之后
关于go - 如何将日志写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19965795/