wx

关注公众号

log


Golang 标准库 - log

log 包实现了简单的日志服务。默认输出到标准错误,每条日志前会加上日期和时间。

主要功能说明:

  1. 打印日志

    • Print()/Println() 打印日志
    • Printf() 格式化打印
    • Fatal()/Fatalf() 打印后退出
    • Panic()/Panicf() 打印后 panic
  2. Logger 配置

    • SetPrefix() 设置前缀
    • SetFlags() 设置日志格式标志
    • SetOutput() 设置输出目标
  3. 自定义 Logger

    • New() 创建新 Logger
    • 可以配置不同的输出和目标
  4. 日志级别

    • 标准库 log 没有内置级别
    • 可通过自定义实现

func main() {
	// 1. 基本日志输出
	fmt.Println("=== 基本日志 ===")
	log.Println("这是一条普通日志")
	log.Printf("格式化日志: %s, %d\n", "hello", 42)

	// 2. 配置日志格式
	fmt.Println("\n=== 配置日志格式 ===")
	
	// 设置前缀
	log.SetPrefix("[APP] ")
	
	// 设置日志标志
	// Ldate | Ltime | Lmicroseconds | Llongfile | Lshortfile | LUTC
	log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds)
	log.Println("带微秒的日志")

	// 包含文件名和行号
	log.SetFlags(log.LstdFlags | log.Lshortfile)
	log.Println("带文件位置的日志")

	// 3. 自定义 Logger
	fmt.Println("\n=== 自定义 Logger ===")
	
	// 创建多个 logger
	infoLogger := log.New(os.Stdout, "[INFO] ", log.Ldate|log.Ltime)
	warnLogger := log.New(os.Stdout, "[WARN] ", log.Ldate|log.Ltime)
	errorLogger := log.New(os.Stderr, "[ERROR] ", log.Ldate|log.Ltime|log.Lshortfile)

	infoLogger.Println("信息日志")
	warnLogger.Println("警告日志")
	errorLogger.Println("错误日志")

	// 4. 日志输出到文件
	fmt.Println("\n=== 日志输出到文件 ===")
	
	file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		log.Fatal("无法打开日志文件:", err)
	}
	defer file.Close()

	// 同时输出到文件和控制台
	multiWriter := io.MultiWriter(os.Stdout, file)
	fileLogger := log.New(multiWriter, "[APP] ", log.LstdFlags)
	fileLogger.Println("这条日志同时输出到控制台和文件")

	// 5. Fatal 和 Panic
	// log.Fatal("致命错误,程序退出")  // 会调用 os.Exit(1)
	// log.Panic("恐慌错误")           // 会 panic

	// 清理
	os.Remove("app.log")
}

// 自定义日志级别实现
type LevelLogger struct {
	debug   *log.Logger
	info    *log.Logger
	warning *log.Logger
	err     *log.Logger
	level   int
}

const (
	DEBUG = iota
	INFO
	WARNING
	ERROR
)

func NewLevelLogger(level int) *LevelLogger {
	return &LevelLogger{
		debug:   log.New(os.Stdout, "[DEBUG] ", log.LstdFlags),
		info:    log.New(os.Stdout, "[INFO] ", log.LstdFlags),
		warning: log.New(os.Stdout, "[WARN] ", log.LstdFlags),
		err:     log.New(os.Stderr, "[ERROR] ", log.LstdFlags|log.Lshortfile),
		level:   level,
	}
}

func (l *LevelLogger) Debug(v ...interface{}) {
	if l.level <= DEBUG {
		l.debug.Println(v...)
	}
}

func (l *LevelLogger) Info(v ...interface{}) {
	if l.level <= INFO {
		l.info.Println(v...)
	}
}

func (l *LevelLogger) Warning(v ...interface{}) {
	if l.level <= WARNING {
		l.warning.Println(v...)
	}
}

func (l *LevelLogger) Error(v ...interface{}) {
	if l.level <= ERROR {
		l.err.Println(v...)
	}
}
如有疑问关注公众号给我留言
wx

关注公众号

©2017-2023 鲁ICP备17023316号-1 Powered by Hugo