go标准库之log模块

298 阅读2分钟

log简介

golang 内置了 log 包,实现简单的日志服务,通过调用 log 包的函数,可以实现简单的日志打印功能

log使用

函数系列作用
print单纯打印日志
panic打印日志,抛出panic异常
fatal打印日志,强制结束程序( os.Exit(1) ), defer 函数不会执行

实例

package main

import (
	"fmt"
	"log"
)

func test1() {
	log.Print("my log")
	log.Printf("my log %d", 100)
	name := "tom"
	age := 20
	log.Println(name, " ", age)
}

func test2() {
	defer fmt.Println("panic 结束后再执行")
	log.Print("my log")
	log.Panic("my panic") // 抛出异常 程序结束(函数返回执行defer) end...不会输出
	fmt.Println("end...")
}

func test3() {
	defer fmt.Println("defer...")
	log.Print("my log")
	log.Fatal("fatal") // os.exit(1)退出系统 函数不返回 不会执行defer
	fmt.Println("end...")
}

func main() {
	// test1()
	// test2()
	test3()
}

log配置

标准log配置

默认情况下 log 只会打印出时间,但是实际情况下我们可能还需要获取文件名、行号信息, log 包提供给我们定制的接口。 log 包提供两个标准的 log 配置相关方法

func Flags() in         // 返回标准log输出配置
func SerFlags(flag int) // 设置标准log输出配置

flag参数

const (
    // 控制输出日志信息的细节,不能控制输出的顺序和格式
    // 输出的日志再每一项后会有一个冒号分隔,例如2009/1/23 01:23:23 /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的初始值
)

标准的配置示例

package main

import (
	"fmt"
	"log"
)

func test3() {
	defer fmt.Println("defer...")
	log.Print("my log")
	log.Fatal("fatal") // os.exit(1)退出系统 函数不返回 不会执行defer
	fmt.Println("end...")
}

func init() {
	log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
        // 还可以添加前缀
	log.SetPrefix("MyLog: ")
}

func main() {
	test3()
}
/*
MyLog: 2022/12/20 11:19:12 d:/Code/go_project/day1/log/log.go:25: my log
MyLog: 2022/12/20 11:19:12 d:/Code/go_project/day1/log/log.go:26: fatal
*/

日志输出位置配置

package main

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

func test3() {
	defer fmt.Println("defer...")
	log.Print("my log")
	log.Fatal("fatal") // os.exit(1)退出系统 函数不返回 不会执行defer
	fmt.Println("end...")
}

func init() {
	log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)
	// 还可以添加前缀
	log.SetPrefix("MyLog: ")
	f, err := os.OpenFile("a.log", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0664)
	// defer f.Close()
	if err != nil {
		log.Fatal("日志文件错误")
	}
	log.SetOutput(f)
}

func main() {
	test3()
}

自定义logger

log 包为我们提供了内置函数,让我们能自定义 logger 。从效果上看,就是将标准日志配置、日志前缀配置、日志输入位置配置整合到一个函数中,使日志配置不再那么繁琐。 log 包提供了如下函数自定义 logger

func New(out io.Writer, prefix string, flag int *Logger)

示例:

package main

import (
	"log"
	"os"
)

var logger *log.Logger

func init() {
	f, err := os.OpenFile("a.log", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0664)
	if err != nil {
		log.Fatal("日志文件错误")
	}
	logger = log.New(f, "Mylog: ", log.Ldate|log.Ltime|log.Llongfile)
}

func main() {
	logger.Print("my log")
}