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")