我正在尝试使用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() 过去的工作方式一定不同,但这对我有用:
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,因为它会打开文件“供阅读:”
log.SetOutput
func Open func Open(name string) (file *File, err error) Open打开命名文件以供读取。如果成功,则可以使用返回文件上的方法进行读取;关联的文件描述符具有mode O_RDONLY。如果有错误,它将是类型*PathError。
func Open
func Open(name string) (file *File, err error) Open打开命名文件以供读取。如果成功,则可以使用返回文件上的方法进行读取;关联的文件描述符具有mode O_RDONLY。如果有错误,它将是类型*PathError。
func Open(name string) (file *File, err error)
Open
O_RDONLY
*PathError
编辑
检查defer f.Close()后移至if err != nil
defer f.Close()
if err != nil