golang的log标准库对于一些简单的日志功能,可以很方便给我们输出相应日志。
本文主要基于日常的简单使用做分享。
1.实现简单的日志记录
见代码:
package main
import (
"log"
"os"
)
func main() {
file, err := os.OpenFile("D:\\demo1\\src\\demo\\demo06\\log-simplest\\simple.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
log.Println("create log file err:", err)
}
// set flags
log.SetFlags(log.LstdFlags|log.Lshortfile)
// set prefix
log.SetPrefix("[DEBUG] ")
// set output
log.SetOutput(file) // 输出到文件设置,如果要输出在控制台,则另外设置多重输出
log.Println("debug log test")
}
2.设置多重输出-控制台 && log文件
见代码:
package main
import (
"fmt"
"io"
"log"
"os"
)
func main() {
file, err := os.OpenFile("D:\\demo1\\src\\demo\\demo06\\log-multiOutput\\set.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
log.Fatal(err)
}
// 1.set log output
//log.SetOutput(file) // 注意同时设置只有一个生效,想要多重输出,建议选择法2或法3
//log.SetOutput(os.Stdout)
// 2.multi output
//multiWriter := io.MultiWriter(file, os.Stdout)
//log.SetOutput(multiWriter)
//log.Print("log line1") // 法1/2 共用测试
//log.Print("log line2")
// 3.log.New()
debugLogger := log.New(io.MultiWriter(os.Stdout, file), "[DEBUG]", log.LstdFlags | log.Lshortfile)
debugLogger.Println("debug logger output with multiOutput")
file.Close()
fmt.Println("program end")
}
3.简单封装实现不同prefix
此封装实现了不同的日志级别,当然更多的级别设置,可以参照实现。
见代码:
// https://juejin.cn/post/6987204299533058078
package logger
import (
"io"
"log"
"os"
)
// flags and prefix
const (
flag = log.Ldate | log.Ltime | log.Lshortfile
preDebug = "[DEBUG] "
preInfo = "[INFO] "
preWarning = "[WARNING] "
preError = "[ERROR] "
)
// diff logger and output log file
var (
logFile io.Writer
debugLogger *log.Logger
infoLogger *log.Logger
warningLogger *log.Logger
errorLogger *log.Logger
defaultLogFile = "D:\\demo1\\src\\demo\\demo06\\log-demo\\logs\\web.log"
)
// init for logger
func init() {
var err error
logFile, err = os.OpenFile(defaultLogFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
defaultLogFile = "./web.log"
logFile, err = os.OpenFile(defaultLogFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
log.Fatalf("create log file err %+v", err)
}
}
debugLogger = log.New(io.MultiWriter(os.Stdout, logFile), preDebug, flag)
infoLogger = log.New(logFile, preInfo, flag)
warningLogger = log.New(logFile, preWarning, flag)
errorLogger = log.New(logFile, preError, flag)
}
// Debug logger
func Debugf(format string, v...interface{}) {
debugLogger.Printf(format, v...)
}
func Infof(format string, v ...interface{}) {
infoLogger.Printf(format, v...)
}
func Warningf(format string, v ...interface{}) {
warningLogger.Printf(format, v...)
}
func Errorf(format string, v ...interface{}) {
errorLogger.Printf(format, v...)
}
// set output file
func setOutputPath(path string) {
var err error
logFile, err = os.OpenFile(defaultLogFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
log.Fatalf("create log file err %+v", err)
}
debugLogger = log.New(logFile, preDebug, flag)
infoLogger = log.New(logFile, preInfo, flag)
warningLogger = log.New(logFile, preWarning, flag)
errorLogger = log.New(logFile, preError, flag)
}
main.go
package main
import (
"log-demo/logger"
)
func main() {
author := "log-demo"
logger.Debugf("hello %s", author)
logger.Infof("hello %s", author)
logger.Warningf("hello %s", author)
logger.Errorf("hello %s", author)
}
4.使用lumberjack切分日志
lumberjack扩展库见链接:go语言的日志滚动(rolling)记录器——lumberjack
见代码:
package main
import (
""gopkg.in/natefinch/lumberjack.v2""
"log"
)
func main() {
lumberLogger := lumberjack.Logger{
Filename: "D:\\demo1\\src\\demo\\demo06\\log-lumberjack\\log.log",
MaxAge: 1,
MaxBackups: 7,
Compress: false,
LocalTime: true,
}
logger := log.New(&lumberLogger, "[DEBUG] ", log.LstdFlags|log.Lshortfile)
logger.Println("lumberjack to rotate log file")
}