GoLang之标准库log包

GoLang标准库log包

1.log包的系列函数

log包定义了Logger类型,该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(Panic|Panicf|Panicln)来使用,比自行创建一个logger对象更容易使用,它们会将日志信息打印到终端界面;
会打印每条日志信息的日期、时间,默认输出到系统的标准错误;
Fatal系列函数会在写入日志信息后调用os.Exit(1);
Panic系列函数会在写入日志信息后panic;
注:默认情况下的logger只会提供日志的时间信息,这是局限性

2.log.Print/Println/Printf函数

func Print(v ...interface{}) {
	std.Output(2, fmt.Sprint(v...))
}

func Printf(format string, v ...interface{}) {
	std.Output(2, fmt.Sprintf(format, v...))
}


func Println(v ...interface{}) {
	std.Output(2, fmt.Sprintln(v...))
}

在这里插入图片描述

3.log.Fatal函数

func Fatal(v ...interface{}) {
	std.Output(2, fmt.Sprint(v...))
	os.Exit(1)
}

image-20220212090751488
在这里插入图片描述

4.log.Panicln函数

func Panicln(v ...interface{}) {
	s := fmt.Sprintln(v...)
	std.Output(2, s)
	panic(s)
}
package main

import (
	"fmt"
	"log"
)

func test_deferpanic() {
	defer func() {
		fmt.Println(11111111)
		if err := recover(); err != nil {
			fmt.Println(2222222)
		}
	}()
	log.Panicln("test for defer Panic")
	defer func() {
		fmt.Println("--second--")
	}()
}

func main() {
	test_deferpanic()
}
//可以看到首先输出了“test for defer Panic”,然后第一个defer函数被调用了并输出,但是第二个defer 函数并没有输出,可见在Panic之后声明的defer是不会执行的。

在这里插入图片描述

5.log.Ldate等const常量

const (
    // 控制输出日志信息的细节,不能控制输出的顺序和格式。
    // 输出的日志在每一项后会有一个冒号分隔:例如2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
    Ldate         = 1 << iota     // 日期:2009/01/23
    Ltime                         // 时间:01:23:23
    Lmicroseconds                 // 微秒级别的时间:01:23:23.123123(用于增强Ltime位)
    Llongfile                     // 文件全路径名+行号: /a/b/c/d.go:23
    Lshortfile                    // 文件名+行号:d.go:23(会覆盖掉Llongfile)
    LUTC                          // 使用UTC时间
    LstdFlags     = Ldate | Ltime // 标准logger的初始值
) 

6.log.SetFlag函数配置logger

默认情况下的logger只会提供日志的时间信息,但是很多情况下我们希望得到更多信息,比如记录该日志的文件名和行号等。log标准库中为我们提供了定制这些设置的方法;
log标准库中的Flags函数会返回标准logger的输出配置,而SetFlags函数用来设置标准logger的输出配置

package main

import (
	"log"
)

func main() {
	/*func SetFlags(flag int) {
		std.SetFlags(flag)
	}*/
	log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
	log.Println("这是一条很普通的日志。")
	//输出:2022/02/28 15:44:28.502256 D:/all project/go/demo/main.go:12: 这是一条很普通的日志。
}

7.log.Flag函数返回标准logger的输出配置

package main

import (
	"fmt"
	"log"
)

func main() {
	/*func Flags() int {
		return std.Flags()
	}*/
	fmt.Println(log.Flags())
	//输出:3
}

8.log.SetPrefix函数配置日志前缀

SetPrefix函数用来设置输出前缀;
这样我们就能够在代码中为我们的日志信息添加指定的前缀,方便之后对日志信息进行检索和处理

package main

import (
	"log"
)

func main() {
	/*func SetPrefix(prefix string) {
		std.SetPrefix(prefix)
	}*/
	log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
	log.Println("这是一条很普通的日志。")
	log.SetPrefix("[pprof]")
	log.Println("这是一条很普通的日志。")
	/*输出如下:
	2022/02/28 15:53:19.345005 D:/all project/go/demo/main.go:9: 这是一条很普通
	的日志。
	[pprof]2022/02/28 15:53:19.414517 D:/all project/go/demo/main.go:11: 这是一
	条很普通的日志。
	*/
}

9.log.Prefix函数配置日志前缀

其中Prefix函数用来查看标准logger的输出前缀

package main

import (
	"fmt"
	"log"
)

func main() {
	/*func Prefix() string {
		return std.Prefix()
	}*/
	fmt.Println(log.Prefix()) //输出:空白的一行
	log.SetPrefix("[pprof]")
	fmt.Println(log.Prefix()) //输出:[pprof]

}

10.log.SetOutput配置日志输出位置

SetOutput函数用来设置标准logger的输出目的地,默认是标准错误输出

package main

import (
	"fmt"
	"log"
	"os"
)

func main() {
	//可以不用手动创建1.log文件,系统会帮我我们自己建
	logFile, err := os.OpenFile("./1.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		fmt.Println("open log file failed, err:", err)
		return
	}
	/*func SetOutput(w io.Writer) {
		std.mu.Lock()
		defer std.mu.Unlock()
		std.out = w
	}*/
	log.SetOutput(logFile)
	log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
	log.Println("这是一条很普通的日志。")
	log.SetPrefix("[小王子]")
	log.Println("这是一条很普通的日志。")
}

在这里插入图片描述

11.log.New函数创建新looger

log标准库中还提供了一个创建新logger对象的构造函数–New,支持我们创建自己的logger示例

package main

import (
	"log"
	"os"
)

func main() {
	/*
		func New(out io.Writer, prefix string, flag int) *Logger {
			return &Logger{out: out, prefix: prefix, flag: flag}
		}*/
	logger := log.New(os.Stdout, "<New>", log.Lshortfile|log.Ldate|log.Ltime)
	logger.Println("这是自定义的logger记录的日志。")
}

12.注意

Go内置的log库功能有限,例如无法满足记录不同级别日志的情况,我们在实际的项目中根据自己的需要选择使用第三方的日志库,如logrus、zap等

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoGo在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值