go原生log模块的简易封装

时间:2022-07-22
本文章向大家介绍go原生log模块的简易封装,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

go的原生log模块,功能稍简单。比如不支持自定义输出级别。只有默认的三个可用。println,Fatal,Panic等

以下对go的原生log模块做的一个简易封装:

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"mime/multipart"
	"os"
	"path"
)

// Level These are the integer logging levels used by the logger
type Level int

// Comment
const (
	DEBUG Level = iota
	INFO
	WARNING
	ERROR
	FATAL
)

var (
	logPrefix  = ""
	levelFlags = []string{"DEBG", "INFO", "WARN", "ERRO", "FATL"}

	logger  *log.Logger
	loggerf *log.Logger

	// curLevel ...
	curLevel Level
	//
	logfile *os.File
)

func init() {
	curLevel = DEBUG
	logger = log.New(os.Stdout, "[default] ", log.LstdFlags)
	logger.SetFlags(log.Ldate | log.Lmicroseconds | log.Llongfile)
}

// Println ..
func Println(l *log.Logger, v ...interface{}) {
	if l != nil {
		l.Output(3, fmt.Sprintln(v...))
	}

}

// Fatalln is equivalent to l.Println() followed by a call to os.Exit(1).
func Fatalln(l *log.Logger, v ...interface{}) {
	if l != nil {
		l.Output(3, fmt.Sprintln(v...))
		os.Exit(1)
	}
}

// Debug ...
func Debug(v ...interface{}) {
	setPrefix(DEBUG)
	if DEBUG >= curLevel {
		Println(logger, v)
		Println(loggerf, v)
	}

}

// Info ...
func Info(v ...interface{}) {
	setPrefix(INFO)
	if INFO >= curLevel {
		Println(logger, v)
		Println(loggerf, v)
	}
}

// Warn ...
func Warn(v ...interface{}) {
	setPrefix(WARNING)
	if WARNING >= curLevel {
		Println(logger, v)
		Println(loggerf, v)
	}
}

// Error Warn
func Error(v ...interface{}) {
	setPrefix(ERROR)
	if ERROR >= curLevel {
		Println(logger, v)
		Println(loggerf, v)
	}
}

// Fatal ...
func Fatal(v ...interface{}) {
	setPrefix(FATAL)
	if FATAL >= curLevel {
		Fatalln(logger, v)
		Fatalln(loggerf, v)
	}

}
func setPrefix(level Level) {
	logPrefix = fmt.Sprintf("[%s] ", levelFlags[level])
	logger.SetPrefix(logPrefix)
	if loggerf != nil {
		loggerf.SetPrefix(logPrefix)
	}
}

// Config ..
func Config(level Level, lfile *os.File) {
	curLevel = level
	loggerf = log.New(lfile, "[default] ", log.LstdFlags)
	loggerf.SetFlags(log.Ldate | log.Lmicroseconds | log.Llongfile)
}

func main() {

	lgfile, err := MustOpen("log.txt", "mylog1/")
	if err != nil {
		Error("Failed to open log file:" + err.Error())
	}

	Config(DEBUG, lgfile)

	Debug("message")
	Info("message")
	Warn("message")
	Error("message")
}

要支持文件,则再加上以下几个操作文件和目录的:

func GetSize(f multipart.File) (int, error) {
	content, err := ioutil.ReadAll(f)

	return len(content), err
}

func GetExt(fileName string) string {
	return path.Ext(fileName)
}

func CheckNotExist(src string) bool {
	_, err := os.Stat(src)
	return os.IsNotExist(err)
}

func CheckPermission(src string) bool {
	_, err := os.Stat(src)
	return os.IsPermission(err)
}

func IsNotExistMkDir(src string) error {
	if notExist := CheckNotExist(src); notExist == true {
		if err := MkDir(src); err != nil {
			return err
		}
	}

	return nil
}

func MkDir(src string) error {
	err := os.MkdirAll(src, os.ModePerm)
	if err != nil {
		return err
	}
	return nil
}

func Open(name string, flag int, perm os.FileMode) (*os.File, error) {
	f, err := os.OpenFile(name, flag, perm)
	if err != nil {
		return nil, err
	}

	return f, nil
}

func MustOpen(fileName, filePath string) (*os.File, error) {
	dir, err := os.Getwd()
	if err != nil {
		return nil, fmt.Errorf("os.Getwd err: %v", err)
	}

	src := dir + "/" + filePath
	perm := CheckPermission(src)
	if perm == true {
		return nil, fmt.Errorf("file.CheckPermission Permission denied src: %s", src)
	}

	err = IsNotExistMkDir(src)
	if err != nil {
		return nil, fmt.Errorf("file.IsNotExistMkDir src: %s, err: %v", src, err)
	}

	f, err := Open(src+fileName, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644)
	if err != nil {
		return nil, fmt.Errorf("Fail to OpenFile :%v", err)
	}

	return f, nil
}