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


    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")
    }
    
  • 相关阅读:
    iOS开发UI篇—字典转模型
    iOS开发UI篇—懒加载
    iOS开发UI篇—九宫格坐标计算
    iOS开发UI篇—简单的浏览器查看程序
    iOS开发UI篇—transframe属性(形变)
    iOS开发UI篇—Button基础
    OS开发UI基础—手写控件,frame,center和bounds属性
    Foundation框架—集合
    Foundation框架—字符串
    uvalive 4255 Guess(拓扑排序)
  • 原文地址:https://www.cnblogs.com/davis12/p/16337827.html
Copyright © 2020-2023  润新知