log
Golang 标准库 - log
log 包实现了简单的日志服务。默认输出到标准错误,每条日志前会加上日期和时间。
主要功能说明:
-
打印日志:
Print()/Println()打印日志Printf()格式化打印Fatal()/Fatalf()打印后退出Panic()/Panicf()打印后 panic
-
Logger 配置:
SetPrefix()设置前缀SetFlags()设置日志格式标志SetOutput()设置输出目标
-
自定义 Logger:
New()创建新 Logger- 可以配置不同的输出和目标
-
日志级别:
- 标准库 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...)
}
}