[go-每日一库] 使用log标准库实现日志功能

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")
}

posted on 2022-06-02 15:10  进击的davis  阅读(405)  评论(0编辑  收藏  举报

导航