• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

go语言log库的使用,并且加强添加日志级别控制

武飞扬头像
倦~
帮助1

每门语言日志都是很重要的一部分,它能帮助我们快速定位到问题。

在go语言中内置了log库,主要有三种使用方式

Println : 打印普通日志

Printf : 打印带格式化的日志

Panic : 打印错误信息

简单使用

下面是一段使用示例

package main
import (
	"log"
)
func main() {
	log.Println("log ... ")
	log.Printf("name %s,age %d", "juan", 20)
	log.Panic("error")
}

输出结果

2022/11/05 17:04:03 log ... 
2022/11/05 17:04:03 name juan,age 20
2022/11/05 17:04:03 error
panic: error

goroutine 1 [running]:
log.Panic({0x14000135f38?, 0x14000102000?, 0x14000135f48?})
	/Users/wendell/support/go/go/src/log/log.go:388  0x64
main.main()
	/Users/wendell/GolandProjects/blog/log.go:61  0xc4

日志打印加强

上面一个简单的日志输出就完成了,但是这还满足不了我们在生产上使用的要求,我们希望能够把员工的工号信息打印出来,日志是在哪一个go文件哪一行中报错的都是关键信息
log库中也给我们提供了对于api

设置一个前缀。

log.SetPrefix()

增强日志信息内容,比如设置了 Lshortfile 就可以打印出go文件以及行号,设置Llongfile,go文件会把包名也打印出来

log.SetFlags()

const (
	Ldate         = 1 << iota     // the date in the local time zone: 2009/01/23
	Ltime                         // the time in the local time zone: 01:23:23
	Lmicroseconds                 // microsecond resolution: 01:23:23.123123.  assumes Ltime.
	Llongfile                     // full file name and line number: /a/b/c/d.go:23
	Lshortfile                    // final file name element and line number: d.go:23. overrides Llongfile
	LUTC                          // if Ldate or Ltime is set, use UTC rather than the local time zone
	Lmsgprefix                    // move the "prefix" from the beginning of the line to before the message
	LstdFlags     = Ldate | Ltime // initial values for the standard logger
)

在原来的go文件中添加如下初始化设置方法

func init() {
	log.SetFlags(log.LstdFlags | log.Lshortfile)
	log.SetPrefix("[工号:test01]")
}

查看打印效果

[工号:test01]2022/11/05 17:11:24 log.go:70: log ... 
[工号:test01]2022/11/05 17:11:24 log.go:71: name juan,age 20
[工号:test01]2022/11/05 17:11:24 log.go:72: error
panic: error

goroutine 1 [running]:
log.Panic({0x140000b7f38?, 0x14000102000?, 0x140000b7f48?})
	/Users/wendell/support/go/go/src/log/log.go:388  0x64
main.main()
	/Users/wendell/GolandProjects/blog/log.go:72  0xc4

日志输出到文件

如果想把日志输出到文件中
需要使用 log.SetOutput()

func init() {
	log.SetFlags(log.LstdFlags | log.Lshortfile)
	log.SetPrefix("[工号:test01]")
	// os.O_CREATE没有文件就创建
	// os.O_WRONLY 可以写入
	// os.O_APPEND 日志追加方式
	file, err := os.OpenFile("log.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		fmt.Println(err)
		return
	}
	log.SetOutput(file)
}

再次执行发现多了一个日志文件,并且有错误信息。

学新通

到这虽然已经很完美了,但是大家接触过其它语言知道,一般我们打印日志会选择打印日志的级别,我们的调试日志都是debug级别。一些系统级别的日志会设置成info级别,报错日志为error级别

在生产上我们通过开关控制只打印info级别以上的日志。

那么go如何实现这样的效果呢。go的log库没有这个功能,我们只能通过继承它的方式对其增强

新增一个结构体 MyLog、定义级别常量、给结构体添加设置级别方法,添加 info、debug、error方法
代码如下

package main

import (
	"log"
)

type MyLog struct {
	*log.Logger
	level int
}

const (
	Debug int = iota
	Info
	Error
)

func NewLog() *MyLog {
	return &MyLog{Logger: log.Default()}
}

func (l *MyLog) SetLevel(level int) {
	l.level = level
}

func (l *MyLog) Info(msgArr ...any) {
	l.print(Info, msgArr...)
}

func (l *MyLog) Debug(msgArr ...any) {
	l.print(Debug, msgArr...)
}

func (l *MyLog) Error(msgArr ...any) {
	l.print(Error, msgArr...)
}

func (l *MyLog) print(level int, msgArr ...any) {
	if l.level <= level {
		l.Logger.Print(msgArr...)
	}
}

var myLog = NewLog()

func init() {
	myLog.SetFlags(log.LstdFlags | log.Lshortfile)
	myLog.SetPrefix("[工号:test01]")
	myLog.SetLevel(Info)
	//file, err := os.OpenFile("log.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	//if err != nil {
	//	fmt.Println(err)
	//	return
	//}
	//myLog.SetOutput(file)
}

func main() {
	myLog.Debug("Debug 日志打印")
	myLog.Info("Info 日志打印")
	myLog.Error("Error 日志打印")
}
学新通

执行结果

[工号:test01]2022/11/05 17:37:39 log.go:40: Info 日志打印
[工号:test01]2022/11/05 17:37:39 log.go:40: Error 日志打印

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgekiee
系列文章
更多 icon
同类精品
更多 icon
继续加载