基于golang的log库编写一个日志插件

基于golang的log库编写一个日志插件,并发写入日志,使用时直接调用里面的公共方法,希望不吝赐教(写完不敢用,怕出问题,因为没有关闭*file)
package utils

import (
	"log"
	"os"
	"sync"
	"time"
)

//日志文件
type logfile struct {
	date     string
	fileName string
	openFile *os.File
}

type logFiles struct {
	rm   sync.RWMutex
	logf map[string]*logfile
}

//存入channel的结构体
type clog struct {
	fileName string
	msg      interface{}
}

var (
	//用channel记录日志
	eChan = make(chan clog, 100)
	nChan = make(chan clog, 100)
	wChan = make(chan clog, 100)
	loger logFiles
)

const flag = log.Llongfile + log.Ltime

func init() {
	logmp := make(map[string]*logfile, 3)
	loger.logf = logmp
	go writerLog() //监控日志写入
}

//获取log *file 资源
func getOpenFile(fileName string) *os.File {
	currentDate := time.Now().Format("2006-01-03")
	if v, ok := loger.logf[fileName]; ok {
		if v.date != currentDate { //判断是否过期

			loger.rm.Lock()
			newOpen, err := os.OpenFile(fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
			if err != nil {
				log.Fatal(err)
			}

			loger.logf[fileName] = &logfile{
				date:     currentDate,
				fileName: fileName,
				openFile: newOpen,
			}
			loger.rm.Unlock()

			return newOpen
		} else {

			return v.openFile
		}
	}

	loger.rm.Lock()
	newOpen, err := os.OpenFile(fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
	if err != nil {
		log.Fatal(err)

	}
	loger.logf[fileName] = &logfile{
		date:     currentDate,
		fileName: fileName,
		openFile: newOpen,
	}
	loger.rm.Unlock()
	return newOpen

}

//将日志写入文件
func writerLog() {

	for {
		select {
		case l := <-eChan:
			file := getOpenFile(l.fileName)

			logger := log.New(file, "", flag)
			logger.Println(l.msg)
			file.Sync()

		case w := <-wChan:
			file := getOpenFile(w.fileName)
			logger := log.New(file, "", flag)
			logger.Println(w.msg)
			file.Sync()
		case n := <-nChan:
			file := getOpenFile(n.fileName)
			logger := log.New(file, "", flag)
			logger.Println(n.msg)
			file.Sync()

		}
	}
}

//警告
func LogWarning(msg interface{}) {
	wChan <- clog{
		fileName: "logs/warning" + time.Now().Format("2006-01-03") + ".log",
		msg:      msg,
	}
}

//致命错误
func LogError(msg interface{}) {
	eChan <- clog{
		fileName: "logs/err" + time.Now().Format("2006-01-03") + ".log",
		msg:      msg,
	}

}

//记录
func LogNote(msg interface{}) {
	nChan <- clog{
		fileName: "logs/note" + time.Now().Format("2006-01-03") + ".log",
		msg:      msg,
	}
}

原创文章 2 获赞 1 访问量 67

猜你喜欢

转载自blog.csdn.net/qq_36456875/article/details/105790084