求教一个 Golang Go语言中自定义 log 的问题

发布于 1周前 作者 sinazl 来自 Go语言

求教一个 Golang Go语言中自定义 log 的问题

目的是想在控制台和文件同时输出,但是我这么写完以后却没有输出 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...)

}


更多关于求教一个 Golang Go语言中自定义 log 的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

defer f.Close()

你文件都关了,还咋往里写?

注意 multi writer 的实现,n 个 writers,第 i 个失败, [i+1,n]就不再写入啦

<br>func (t *multiWriter) Write(p []byte) (n int, err error) {<br> for _, w := range t.writers {<br> n, err = w.Write(p)<br> if err != nil {<br> return<br> }<br> if n != len(p) {<br> err = ErrShortWrite<br> return<br> }<br> }<br> return len(p), nil<br>}<br>

更多关于求教一个 Golang Go语言中自定义 log 的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢大佬。这块代码是看 https://www.jianshu.com/p/2e1d34c699c5 的,他也写了 defer f.Close(),所以这是写错了么

感谢,可以了~

嗯。。一开始 defer 没怎么看,刚刚去看了一下,defer 是在函数结束时调用,我的 logger 在外部获取,相当于已经关闭了我还想往里写内容肯定不行

你可能没理解我的意思

1 、你这个代码的错误点在于 defer f.Close(), InitWriter() 返回后,f 就被关掉了,后续的 log Write 会失败
2 、把 defer f.Close() 去掉只是看起来 work 的方案,文件的关闭还是需要自行处理一下的

我可能没表达清楚,和你的意思是一样的。网上的只是写了一个演示,写完直接就关掉了,我要一直往里写,但一开始照着他所以写不进去

在 main 函数中去打开,关闭这个文件就好了

在 Golang 中自定义日志记录是一个常见的需求,它可以帮助你更好地控制日志的格式、输出级别和目的地(如文件、控制台等)。以下是一些基本步骤来实现自定义日志:

  1. 导入标准库: 首先,你需要导入 Go 的标准日志库 log。如果你需要更高级的功能,也可以考虑使用第三方库如 logruszap

  2. 创建自定义 Logger: 你可以通过 log.New 方法创建一个新的 Logger 实例,指定输出目标(如 os.Stdout)、前缀(如时间戳、日志级别)和标志(如是否打印文件名和行号)。

  3. 设置日志级别: 定义一个日志级别(如 DEBUG、INFO、WARN、ERROR),并在 Logger 中根据级别决定是否打印日志。这通常通过封装 Logger 实现。

  4. 自定义日志格式: 你可以通过定义日志前缀或实现一个自定义的 io.Writer 来完全控制日志格式。例如,你可以使用 time.Now().Format 来添加时间戳,或者使用格式化字符串来组合其他信息。

  5. 输出到文件: 如果需要将日志输出到文件,可以将文件句柄(如 os.OpenFile 返回的句柄)传递给 log.New

  6. 使用 Logger: 在你的代码中,使用自定义的 Logger 实例来记录日志。

通过这些步骤,你可以创建一个功能强大且灵活的日志系统,满足你的具体需求。如果你需要更详细的代码示例或进一步的帮助,请随时提问。

回到顶部