go自定义日志

代码小白一个,可能代码有多处漏洞,欢迎留言-

mian.go文件

func main() {
	_, err := os.OpenFile("", os.O_RDWR, 0666)
	//log.SetFile("./log/error.log")
	log.Error("出错啦: ", err)
	log.WriteReqError(errors.Wrap(err, "不小心出错了"), nil)
}

log.go文件

package log

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"os"
	"sync"
	"time"
)

const (
	_ = iota
	Level_Info
	Level_Debug
	Level_Error
	Level_Warn
)

var wg sync.WaitGroup
var log *Log

func init() {
	log = &Log{file: "./log/error.log"}	// 默认日志文件路径
}

type Log struct {
	file string
}

func Info(v ...interface{}) {
	log.outPut(Level_Info, v...)
}
func Debug(v ...interface{}) {
	log.outPut(Level_Debug, v...)
}
func Error(v ...interface{}) {
	log.outPut(Level_Error, v...)
}
func Warn(v ...interface{}) {
	log.outPut(Level_Warn, v...)
}

// SetFile 设置日志文件路径
func SetFile(file string) {
	log.file = file
}

// WriteReqError 写入请求类日志
func WriteReqError(error error, c *gin.Context) {
	log.requestPut(error, c)
}

func (l *Log) outPut(level int, v ...interface{}) {
	wg.Add(1)
	go func() {
		defer wg.Done()
		str := time.Now().Format("2006-01-02 15:04:05 [")
		switch level {
		case Level_Info:
			str += "INFO"
			break
		case Level_Debug:
			str += "DEBUG"
			break
		case Level_Error:
			str += "ERROR"
			break
		case Level_Warn:
			str += "WARN"
			break
		}
		str += "] " + fmt.Sprint(v...) + "\n"
		fmt.Print(str)
		l.openFile(str)
	}()
	wg.Wait()
}

func (l *Log) requestPut(err error, c *gin.Context) {
	wg.Add(1)
	go func() {
		defer wg.Done()
		str := time.Now().Format("2006-01-02 15:04:05 [ERROR] ")
		if c != nil {
			str = fmt.Sprintf("%s\n请求地址:%s\n请求方式:%s\n请求ip:%s\n", str,
				c.Request.RequestURI,
				c.Request.Method,
				c.ClientIP())
		}
		if err != nil {
			str = fmt.Sprintf("%s%s\n", str, err)
		}
		fmt.Print(str)
		l.openFile(str)
	}()
	wg.Wait()
}

func (l *Log) openFile(msg string) {
	f, err := os.OpenFile(l.file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		fmt.Println("日志文件打开失败:", err)
		return
	}
	defer f.Close()
	_, err = f.WriteString(msg)
	if err != nil {
		fmt.Println("文件写入失败:", err)
		return
	}
}

微信号: cloud-month ,欢迎一起学习交流技术问题