go中自带log库的使用
log库的使用
log库的导入,很简单,import log 即可:
package main
import (
"log"
)
func main(){
log.Println("Come with fatal,exit with 1")
}
打印一下,默认会输出在终端里的标准输出:
$ go run log.go
2020/08/31 19:14:20 Come with fatal,exit with 1
log 包 提供了很多方法,它的使用方式和 fmt包的一样。可以自己尝试一下。
func Fatal(v ...interface{})
func Fatalf(format string, v ...interface{})
func Fatalln(v ...interface{})
func Flags() int
func Panic(v ...interface{})
func Panicf(format string, v ...interface{})
func Panicln(v ...interface{})
func Prefix() string
func Print(v ...interface{})
func Printf(format string, v ...interface{})
func Println(v ...interface{})
func SetFlags(flag int)
func SetPrefix(prefix string)
值得注意的是:Fatal 和 Panic 相关的会输出日志的同时,还会退出和产生panic。
自定义内容输出
默认的log输出很简单,只输出了当前的日期、时间、和内容。我们也可以定制化的。
package main
import (
"log"
)
func main(){
//设置前缀
log.SetPrefix("[ERROR]")
//设置要打印的内容:日期,时间,长文件名
log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
//设置要输出的终端,默认是控制台
log.SetOutput(os.Stderr)
log.Println("Come with fatal,exit with 1")
}
执行一下:
$ go run log.go
[ERROR]2020/08/31 19:21:33 /Users/bba/www/gowww/hello/log.go:22: Come with fatal,exit with 1
exit status 1
我们可以看到,它按照我们的设定,输出了很多自定义的内容。
输出到日志文件里
上面的例子,默认都是输出到标准输出终端里的,我们可以改一下,让它输出到文件里
package main
import (
"log"
)
func main(){
//设置前缀
log.SetPrefix("[ERROR]")
//设置要打印的内容:日期,时间,长文件名
log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
fileName:= "debug.log"
//打开文件,并且设置了文件打开的模式
logFile, _ := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
//设置输出方式为:文件
log.SetOutput(io.MultiWriter(logFile))
//输出
log.Println(123)
log.Printf("%v, %T", []int{1,2,3,4}, []int{1,2,3,4})
}
打印看看,目录下出现了,打开看一下
$ go run log.go
$ vi debug.log
[ERROR]2020/08/31 19:48:40 /Users/bba/www/gowww/hello/log.go:45: 123
[ERROR]2020/08/31 19:48:40 /Users/bba/www/gowww/hello/log.go:46: [1 2 3 4], []int
调用log类的New方法
刚才的设置都是log全局的,你设置了之后,其他地方调用就会全部替换了,这样其实并不好,容易出问题,所以,log库,也提供了New方法,
它有3个参数,第一个是输出方式,第二个前缀,第三个是输出的内容。
func New(out io.Writer, prefix string, flag int) *Logger
所以,我们就可以这样自定义几个函数:
//error
func ERROR(msg interface{}) {
fileName := time.Now().Format("2006-01-02")
fileName += ".log"
logFile, _ := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
//多个地方同时写入
Error = log.New(io.MultiWriter(logFile, os.Stderr),
"[ERROR]: ",
log.Ldate|log.Ltime|log.Llongfile)
Error.Fatalln(msg)
}
//debug
func DEBUG(msg interface{}) {
fileName := time.Now().Format("2006-01-02")
fileName += ".log"
logFile, _ := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
//多个地方同时写入
Debug = log.New(io.MultiWriter(logFile, os.Stderr),
"[DEBUG]: ",
log.Ldate|log.Ltime|log.Llongfile)
Debug.Println(msg)
}
然后我们可以,并发调用一下:
for i := 0; i < 100; i++ {
go DEBUG(i)
}
time.Sleep(time.Second)
日志记录器是多 goroutine 安全的。这意味着在多个goroutine 可以同时调用来自同一个日志记录器的这些函数,而不会有彼此间的写冲突。标准日志记录器具有这一性质,用户定制的日志记录器也应该满足这一性质。
[参考]
https://www.jianshu.com/p/73ae6dc4d16a
https://blog.51cto.com/gotaly/1405754
本文介绍了Go语言内置log库的使用,包括如何导入和使用log库,自定义内容输出,将日志输出到文件,以及通过调用log.New方法创建自定义日志记录器。示例代码展示了如何实现多线程安全的日志记录。
5万+

被折叠的 条评论
为什么被折叠?



