知识点 log日志

package demo_log

import (
"fmt"
"log"
"os"
"path/filepath"
"runtime"
"strings"
"time"
)

func main() {
const (
info = iota
warn
error
fatal
)
//第一种方法将打印信息写入文件
//logrus.Println("打印日志信息")
//logrus.Panicln("打印panic日志信息")
//logrus.Fatal("打印Fatal日志信息") //带有自动退出功能
//aa := "C:\\Users\\10241874\\go\\src\\awesomeProject\\src\\Log\\log.txt"
//fmt.Println(aa)
//f, _ := os.OpenFile(aa, os.O_APPEND|os.O_CREATE, 0777)
//Logger := log.New(f, "[info]", log.Ltime)
//Logger.Println("dayinkaishi")
//f.Close()

//第二种方法将打印信息写入文件(建议直接看src/log文件夹下的log.go文件)
aa := "C:\\Users\\10241874\\go\\src\\awesomeProject\\src\\Log\\log_" + time.Now().Format("2006-01-02") + ".txt"
fmt.Println(aa)
fmt.Println(warn, error, fatal)
f, _ := os.OpenFile(aa, os.O_APPEND|os.O_CREATE, 0777)
f.WriteString("dayinkaishi")
f.Close()

call0("")
}

//log.SetOutput(file) //设置输出流
//log.SetPrefix("[Error]") //日志前缀
//log.SetFlags(log.Llongfile | log.Ldate | log.Ltime) //日志输出样式
func call0(funcname string) {
pc, filename, line, ok := runtime.Caller(1) //输出层及对应的信息
if ok {
funcname = runtime.FuncForPC(pc).Name() //FuncForPC()返回函数的指针类型
log.Println("00", funcname)
funcname = filepath.Ext(funcname) //删除.之前的部分
log.Println("11", funcname)
funcname = strings.TrimPrefix(funcname, ".")
log.Println("22", funcname)

filename = filepath.Base(filename)
}
logPrefix := fmt.Sprintf("%s %d %s ", filename, line, funcname)
log.Println(logPrefix)
log.Println(pc)
}





log.go
package log

import (
"fmt"
"log"
"os"
"path/filepath"
"strings"
//"sync"
"runtime"
"time"
)

const (
debug = iota
info
warn
error
fatal
)

type Log struct {
logLevel int

logChannel chan string
}

var (
logObj = Log{logLevel: info, logChannel: make(chan string, 1024)}
levelMap = make(map[string]int)
levelStrMap = make(map[int]string)
LogPath string = "../log/" //windows 下调试模式
)

func initLevelMap() {
levelMap["fatal"] = fatal
levelMap["error"] = error
levelMap["warn"] = warn
levelMap["info"] = info
levelMap["debug"] = debug

levelStrMap[fatal] = "fatal"
levelStrMap[error] = "error"
levelStrMap[warn] = "warn"
levelStrMap[info] = "info"
levelStrMap[debug] = "debug"
if strings.Contains(runtime.GOOS, "linux") {
//linux 发布模式
LogPath = `/home/parameterCheckww/parameterCheckService2/src/log/`
}
}

func init() {
initLevelMap()
}

func Fatal(v ...interface{}) {
logObj.Fatal(v...)
}

func Error(v ...interface{}) {
logObj.Error(v...)
}

func Warn(v ...interface{}) {
logObj.Warn(v...)
}

func Info(v ...interface{}) {
logObj.Info(v...)
}

func Debug(v ...interface{}) {
logObj.Debug(v...)
}

func SetLogLevel(level string) {
logObj.SetLogLevel(level)

}
func GetLogLevel() int {
return logObj.GetLogLevel()
}

func RunLogFileThread() {

logObj.RunLogFileThread()
}

func (self *Log) SetLogLevel(level string) {
_, ok := levelMap[level]
if ok {
self.logLevel = levelMap[level]
log.Println("logLevel has changed:" + level)
} else {
log.Println("loglevel is error")
}

}
func (self *Log) GetLogLevel() int {
return self.logLevel
}

func (self *Log) Fatal(v ...interface{}) {
self.printWithCheckLevel(fatal, v...)
}

func (self *Log) Error(v ...interface{}) {
self.printWithCheckLevel(error, v...)
}

func (self *Log) Warn(v ...interface{}) {
self.printWithCheckLevel(warn, v...)
}

func (self *Log) Info(v ...interface{}) {
self.printWithCheckLevel(info, v...)
}

func (self *Log) Debug(v ...interface{}) {
self.printWithCheckLevel(debug, v...)
}

func (self *Log) printWithCheckLevel(logLevel int, v ...interface{}) {
if self.logLevel > logLevel {
self.logChannel <- ""
return
}

filename, line, funcname := "???", 0, "???"
pc, filename, line, ok := runtime.Caller(3)
if ok {
funcname = runtime.FuncForPC(pc).Name()
funcname = filepath.Ext(funcname)
funcname = strings.TrimPrefix(funcname, ".")

filename = filepath.Base(filename)
}
logPrefix := fmt.Sprintf("%s %s %d %s", time.Now().Format("2006-01-02 15:04:05.000"), filename, line, funcname)

str := strings.TrimRight(strings.TrimPrefix(strings.TrimSpace(fmt.Sprintln(v)), "["), "]")
str = logPrefix + "[" + levelStrMap[logLevel] + "] " + strings.TrimSpace(str)

log.Println(str)

self.logChannel <- str + "\n"
}

func (self *Log) WriteLogFile(log string) {
// logFile, err := os.OpenFile("../log/log_"+time.Now().Format("2006-01-02")+".txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
logFile, err := os.OpenFile(LogPath+"log_"+time.Now().Format("2006-01-02")+".txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
fmt.Println("open log file failed!!!")
return
}
logFile.WriteString(log)
logFile.Close()
}

func (self *Log) RunLogFileThread() {
for {
strlog := <-self.logChannel
self.WriteLogFile(strlog)

}

}
posted @ 2019-08-17 15:33  初见未来  阅读(446)  评论(0编辑  收藏  举报