go 語言的日誌處理系統

go語言寫的輕量級日誌系統,純原創,代碼貼出來供大家參考,有問題歡迎留言討論

主體代碼:

package tonylog

import (
	"fmt"
	"github.com/wxnacy/wgo/arrays"
	"os"
	"runtime"
	"syscall"
	"time"
)

type tonyLog struct {
	data string
	dataType string
	date string
	url string
}

const (
	//日誌地址
	FILE_PATH string = ""
	//報錯級別
	LEVEL int = 0
)

var log []tonyLog

func Write(action string, str string) error {

	actionType := []string{
		"debug","info","warn","error","fatal","panic",
	}
	index := arrays.ContainsString(actionType, action)

	if index == -1{
		return fmt.Errorf("級別設置有誤")
	}
	if index < LEVEL {
		return nil
	}

	infoLog := new(tonyLog)
	infoLog.data = str;
	infoLog.dataType = action
	infoLog.date = time.Now().Format("2006-01-02 15:04:05")
	infoLog.url = runFuncName(3)
	handle(*infoLog)
	return nil
}

//處理日誌
func handle(singLog tonyLog){
	log = append(log, singLog)
	handleDone(log)
}

//寫日誌
func handleDone(log []tonyLog){
	var path string
	if len(FILE_PATH) > 0 {
		path = FILE_PATH;
	}else{
		path,_ = os.Getwd()
	}

	//使用文件鎖
	syscall.ForkLock.Lock()

	fullPath,file := getFilePath(path)
	fp,err:= os.OpenFile(checkFilePath(fullPath,file),os.O_APPEND, os.ModeAppend)

	if(err != nil){
		fmt.Println(err)
	}

	for _,v := range log{
		_,err := fp.WriteString("["+v.date+"]"+"["+v.dataType+"]"+"["+v.url+"]"+"["+v.data+"]\r\n")
		if err != nil {
			panic("寫入日誌失敗")
		}
	}
	err = fp.Close()

	//釋放文件鎖
	syscall.ForkLock.Unlock()

	if err != nil {
		panic("寫入流關閉失敗")
	}

	//情況數組
	log = []tonyLog{}
}

//獲取默認日誌路徑
func getFilePath(path string) (fullPath string,file string) {
	//設置日誌保存記錄
	return path+"\\runtime",time.Now().Format("2006-01-02")+".log"
}

//判斷目標文件是否存在,不存在就創建
func checkFilePath(path string,file string) string {
	//獲取路徑文件相關信息
	_,err := os.Stat(path)
	//如果存在錯誤,說明目標文件不存在,要創建
	if err != nil {
		os.MkdirAll(path,0777)
	}

	lastPath := path+"\\"+file

	//創建文件
	_,err = os.Stat(lastPath)
	if err != nil {
		_,err = os.Create(path+"\\"+file)
		if err != nil{
			//如果文件創建錯誤,拋出異常
			panic("文件創建失敗")
		}
	}
	return lastPath
}

// 獲取正在運行的函數名
func runFuncName(i int)string{
	pc := make([]uintptr,1)
	runtime.Callers(i,pc)
	f := runtime.FuncForPC(pc[0])
	return f.Name()
}

示例:

tonylog.Write("debug","this is log")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章