求教一个 Golang Go语言中自定义 log 的问题
求教一个 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
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 中自定义日志记录是一个常见的需求,它可以帮助你更好地控制日志的格式、输出级别和目的地(如文件、控制台等)。以下是一些基本步骤来实现自定义日志:
-
导入标准库: 首先,你需要导入 Go 的标准日志库
log
。如果你需要更高级的功能,也可以考虑使用第三方库如logrus
或zap
。 -
创建自定义 Logger: 你可以通过
log.New
方法创建一个新的 Logger 实例,指定输出目标(如os.Stdout
)、前缀(如时间戳、日志级别)和标志(如是否打印文件名和行号)。 -
设置日志级别: 定义一个日志级别(如 DEBUG、INFO、WARN、ERROR),并在 Logger 中根据级别决定是否打印日志。这通常通过封装 Logger 实现。
-
自定义日志格式: 你可以通过定义日志前缀或实现一个自定义的
io.Writer
来完全控制日志格式。例如,你可以使用time.Now().Format
来添加时间戳,或者使用格式化字符串来组合其他信息。 -
输出到文件: 如果需要将日志输出到文件,可以将文件句柄(如
os.OpenFile
返回的句柄)传递给log.New
。 -
使用 Logger: 在你的代码中,使用自定义的 Logger 实例来记录日志。
通过这些步骤,你可以创建一个功能强大且灵活的日志系统,满足你的具体需求。如果你需要更详细的代码示例或进一步的帮助,请随时提问。