go中自带log库的使用

本文介绍了Go语言内置log库的使用,包括如何导入和使用log库,自定义内容输出,将日志输出到文件,以及通过调用log.New方法创建自定义日志记录器。示例代码展示了如何实现多线程安全的日志记录。
部署运行你感兴趣的模型镜像

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)

值得注意的是:FatalPanic 相关的会输出日志的同时,还会退出和产生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

您可能感兴趣的与本文相关的镜像

GPT-SoVITS

GPT-SoVITS

AI应用

GPT-SoVITS 是一个开源的文本到语音(TTS)和语音转换模型,它结合了 GPT 的生成能力和 SoVITS 的语音转换技术。该项目以其强大的声音克隆能力而闻名,仅需少量语音样本(如5秒)即可实现高质量的即时语音合成,也可通过更长的音频(如1分钟)进行微调以获得更逼真的效果

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值