logger.go 2.33 KB
package log

import (
	"bytes"
	"fmt"
	"git.168cad.top/zhengqiuyun/rym-util/conf"
	"runtime"
	"strconv"
	"strings"
	"time"
)

const (
	LevelDebug = "Debug"
	LevelInfo  = "Info"
	LevelError = "Error"
)

func DebugDo(f func()) {
	if IsDebug() {
		f()
	}
}

func IsDebug() bool {
	ok := false
	switch strings.ToLower(conf.LogLevel) {
	case strings.ToLower(LevelDebug):
		ok = true
		break
	}
	return ok
}

func Debug(msg string) {
	ok := false
	switch strings.ToLower(conf.LogLevel) {
	case strings.ToLower(LevelDebug):
		ok = true
		break
	}
	if ok {
		_, file, line, _ := runtime.Caller(1)
		print("Debug", msg, file, line)
	}
}

func Info(msg string) {
	ok := false
	switch strings.ToLower(conf.LogLevel) {
	case strings.ToLower(LevelDebug):
		ok = true
		break
	case strings.ToLower(LevelInfo):
		ok = true
		break
	}
	if ok {
		_, file, line, _ := runtime.Caller(1)
		print("Info", msg, file, line)
	}
}

func Error(msg string) {
	ok := false
	switch strings.ToLower(conf.LogLevel) {
	case strings.ToLower(LevelDebug):
		ok = true
		break
	case strings.ToLower(LevelInfo):
		ok = true
		break
	case strings.ToLower(LevelError):
		ok = true
		break
	}
	if ok {
		_, file, line, _ := runtime.Caller(1)
		print("Error", msg, file, line)
	}
}



// Colors
const (
	reset       = "\033[0m"
	red         = "\033[31m"
	green       = "\033[32m"
	yellow      = "\033[33m"
	blue        = "\033[34m"
	magenta     = "\033[35m"
	cyan        = "\033[36m"
	white       = "\033[37m"
	blueBold    = "\033[34;1m"
	magentaBold = "\033[35;1m"
	redBold     = "\033[31;1m"
	yellowBold  = "\033[33;1m"
)

func print(tag, msg string, file string, line int) {
	str := "%s %s [%d] %s %d %s"
	if conf.LogColorful {
		if tag == "Error" {
			str = "%s %s [%d] %s %d " + red + "%s" + reset
		} else if tag == "Info" {
			str = "%s %s [%d] %s %d " + yellow + "%s" + reset
		} else {
			str = "%s %s [%d] %s %d " + green + "%s" + reset
		}
	}
	file = file[strings.LastIndex(file, "/")+1:]
	fmt.Println(fmt.Sprintf(str, formatDateMillTime(time.Now()), tag, getGID(), file, line, msg))
}

func formatDateMillTime(dataTime time.Time) string {
	return dataTime.Format("2006-01-02 15:04:05.000000")
}

func getGID() uint64 {
	b := make([]byte, 64)
	b = b[:runtime.Stack(b, false)]
	b = bytes.TrimPrefix(b, []byte("goroutine "))
	b = b[:bytes.IndexByte(b, ' ')]
	n, _ := strconv.ParseUint(string(b), 10, 64)
	return n
}