目的是想在控制台和文件同时输出,但是我这么写完以后却没有输出 Read Config……
我如果把 InitWriter 的整个代码都放在 init 里就能输出了……
为啥会这样
截取了一部分代码
不打算用第三方库,需求比较简单
go 刚学一个星期,有些实在不太懂,求教大佬了
package main var logger *log.Logger func init() { logger = log.New(InitWriter(), "", log.Ldate|log.Ltime|log.Lshortfile) logger.Println("Read Config……") } func InitWriter() io.Writer { if !PathExists("./log/") { os.Mkdir("./log/", 0773) } path := "./log/" + time.Now().Format("2006-01-02") + ".log" f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0773) if err != nil { log.Fatal(err) } defer f.Close() writers := []io.Writer{ f, os.Stdout} return io.MultiWriter(writers...) }
![]() | 1 sdrzlyz 2020-04-03 12:51:22 +08:00 defer f.Close() 你文件都关了,还咋往里写? 注意 multi writer 的实现,n 个 writers,第 i 个失败, [i+1,n]就不再写入啦 ``` func (t *multiWriter) Write(p []byte) (n int, err error) { for _, w := range t.writers { n, err = w.Write(p) if err != nil { return } if n != len(p) { err = ErrShortWrite return } } return len(p), nil } ``` |
2 ljy1398202806 OP @sdrzlyz 感谢大佬。这块代码是看 https://www.jianshu.com/p/2e1d34c699c5 的,他也写了 defer f.Close(),所以这是写错了么 |
3 ljy1398202806 OP @sdrzlyz 感谢,可以了~ |
4 ljy1398202806 OP @sdrzlyz 嗯。。一开始 defer 没怎么看,刚刚去看了一下,defer 是在函数结束时调用,我的 logger 在外部获取,相当于已经关闭了我还想往里写内容肯定不行 |
![]() | 5 sdrzlyz 2020-04-03 12:59:12 +08:00 @ljy1398202806 你可能没理解我的意思 1 、你这个代码的错误点在于 defer f.Close(), InitWriter() 返回后,f 就关掉了,后续的 log Write 会失败 2 、把 defer f.Close() 去掉只是看起来 work 的方案,文件的关闭还是需要自行处理一下的 |
6 ljy1398202806 OP @sdrzlyz 我可能没表达清楚,和你的意思是一样的。网上的只是写了一个演示,写完直接就关掉了,我要一直往里写,但一开始照着他所以写不进去 |
![]() | 7 yuanchao 2020-04-03 13:44:29 +08:00 在 main 函数中去打开,关闭这个文件就好了 |