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