├── .travis.yml ├── example ├── images │ └── display.png └── example.go ├── constant.go ├── joint_darwin.go ├── joint_linux.go ├── joint_windows.go ├── log_factory.go ├── log.go ├── README.md ├── log_test.go ├── print_darwin.go ├── print_linux.go └── print_windows.go /.travis.yml: -------------------------------------------------------------------------------- 1 | language: go 2 | 3 | go: 4 | - 1.11.x -------------------------------------------------------------------------------- /example/images/display.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/corgi-kx/logcustom/HEAD/example/images/display.png -------------------------------------------------------------------------------- /constant.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | //默认是否彩色打印 4 | var isColor = true 5 | 6 | type logType int 7 | 8 | //日志等级 9 | const ( 10 | Leveltrace logType = iota //基本输出, 11 | Levelinfo //系统信息 12 | Leveldebug //系统调试 13 | Levelwarn //系统警告,提示有可预测的错误 14 | Levelerror //程序错误,不影响继续使用 15 | Levelpanic //程序异常,递归调用本层及上层defer后,中断程序进程,类似java的异常处理 16 | Levelfatal //程序直接结束,打印错误信息后直接调用os.Exit(1)结束程序,不会调用各层defer 17 | ) 18 | 19 | type colorType uint8 20 | 21 | //日志打印颜色 22 | const ( 23 | colorBlack colorType = iota + 30 24 | colorRed //红色 25 | colorGreen //绿色 26 | colorYellow //黄色 27 | colorBlue //蓝色 28 | colorPurple //紫色 29 | colorDarkblue //碧蓝 30 | ) 31 | 32 | //日志打印颜色 33 | const ( 34 | WinColorBlue colorType = iota + 9 //蓝色 35 | WinColorGreen //绿色 36 | WinColorDarkblue //碧蓝 37 | WinColorRed //红色 38 | WinColorPurple //紫色 39 | WinColorYellow //黄色 40 | ) 41 | 42 | //日志头部标志 43 | const ( 44 | lTrace = "[TRACE]" 45 | lInfo = "[INFO]" 46 | lDebug = "[DEBUG]" 47 | lWarn = "[WARN]" 48 | lError = "[ERROR]" 49 | lPanic = "[PANIC]" 50 | lFatal = "[FATAL]" 51 | ) 52 | -------------------------------------------------------------------------------- /joint_darwin.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | import ( 4 | "fmt" 5 | "path/filepath" 6 | "runtime" 7 | "strings" 8 | "time" 9 | ) 10 | 11 | //传入要打印的信息,拼接好后返回 12 | func joint(prefix, message string, color colorType) string { 13 | now := time.Now().Format("2006/01/02 15:04:05") 14 | filename, funcname, line := getpProcInfo() 15 | s := fmt.Sprint(prefix, ": ", now, " ", filename, ":", line, ":", funcname, ": ", message) 16 | if isColor { 17 | //s = fmt.Sprintf("\x1b[%dm%s\x1b[0m", color, s) 18 | s = fmt.Sprintf("\033[%dm%s\033[0m", color, s) 19 | } 20 | return s 21 | } 22 | 23 | func (l mylog) joint(prefix, message string, color colorType) string { 24 | now := time.Now().Format("2006/01/02 15:04:05") 25 | filename, funcname, line := getpProcInfo() 26 | s := fmt.Sprint(prefix, ": ", now, " ", filename, ":", line, ":", funcname, ": ", message) 27 | if l.isColor { 28 | //s = fmt.Sprintf("\x1b[%dm%s\x1b[0m", color, s) 29 | s = fmt.Sprintf("\033[%dm%s\033[0m", color, s) 30 | } 31 | return s 32 | } 33 | 34 | //获取打印日志的进程信息 35 | func getpProcInfo() (filename, funcname string, line int) { 36 | pc, filename, line, ok := runtime.Caller(3) 37 | if ok { 38 | funcname = runtime.FuncForPC(pc).Name() // main.(*MyStruct).foo 39 | funcname = filepath.Ext(funcname) // .foo 40 | funcname = strings.TrimPrefix(funcname, ".") // foo 41 | filename = filepath.Base(filename) // /full/path/basename.go => basename.go 42 | } 43 | return 44 | } 45 | -------------------------------------------------------------------------------- /joint_linux.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | import ( 4 | "fmt" 5 | "path/filepath" 6 | "runtime" 7 | "strings" 8 | "time" 9 | ) 10 | 11 | //传入要打印的信息,拼接好后返回 12 | func joint(prefix, message string, color colorType) string { 13 | now := time.Now().Format("2006/01/02 15:04:05") 14 | filename, funcname, line := getpProcInfo() 15 | s := fmt.Sprint(prefix, ": ", now, " ", filename, ":", line, ":", funcname, ": ", message) 16 | if isColor { 17 | //s = fmt.Sprintf("\x1b[%dm%s\x1b[0m", color, s) 18 | s = fmt.Sprintf("\033[%dm%s\033[0m", color, s) 19 | } 20 | return s 21 | } 22 | 23 | func (l mylog) joint(prefix, message string, color colorType) string { 24 | now := time.Now().Format("2006/01/02 15:04:05") 25 | filename, funcname, line := getpProcInfo() 26 | s := fmt.Sprint(prefix, ": ", now, " ", filename, ":", line, ":", funcname, ": ", message) 27 | if l.isColor { 28 | //s = fmt.Sprintf("\x1b[%dm%s\x1b[0m", color, s) 29 | s = fmt.Sprintf("\033[%dm%s\033[0m", color, s) 30 | } 31 | return s 32 | } 33 | 34 | //获取打印日志的进程信息 35 | func getpProcInfo() (filename, funcname string, line int) { 36 | pc, filename, line, ok := runtime.Caller(3) 37 | if ok { 38 | funcname = runtime.FuncForPC(pc).Name() // main.(*MyStruct).foo 39 | funcname = filepath.Ext(funcname) // .foo 40 | funcname = strings.TrimPrefix(funcname, ".") // foo 41 | filename = filepath.Base(filename) // /full/path/basename.go => basename.go 42 | } 43 | return 44 | } 45 | -------------------------------------------------------------------------------- /example/example.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | log "github.com/corgi-kx/logcustom" 5 | "os" 6 | ) 7 | 8 | func main() { 9 | log.Info("Write something you want to print !") 10 | log.Warn("Write something you want to print !") 11 | log.Trace("Write something you want to print !") 12 | log.Debug("Write something you want to print !") 13 | log.Error("Write something you want to print !") 14 | 15 | //设置输出信息隐藏等级 16 | err := log.SetLogDiscardLevel(log.Leveldebug) 17 | if err != nil { 18 | log.Error(err) 19 | } 20 | 21 | log.Info("SetLogDiscardLevel test !") //INFO不会被打印 22 | log.Debug("SetLogDiscardLevel test !") 23 | log.Warn("SetLogDiscardLevel test !") 24 | 25 | //创建新的日志对象 26 | mylog := log.New() 27 | file, err := os.OpenFile("log.txt", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666) 28 | if err != nil { 29 | log.Error(err) 30 | } 31 | //将日志信息输出到指定文件 32 | mylog.SetOutputAbove(file, log.Levelwarn) //WARN及WARN以上级别的日志会输出到指定文件 33 | mylog.Trace("SetOutputAll test !") 34 | mylog.Info("SetOutputAll test !") 35 | mylog.Debug("SetOutputAll test !") 36 | mylog.Warn("SetOutputAll test !") 37 | mylog.Error("SetOutputAll test !") 38 | } 39 | 40 | //func DisplayEffect () { 41 | // log.Info("Write something you want to print !") 42 | // log.Warn("Write something you want to print !") 43 | // log.Trace("Write something you want to print !") 44 | // log.Debug("Write something you want to print !") 45 | // log.Error("Write something you want to print !") 46 | // log.Fatal("Write something you want to print !") 47 | //} 48 | -------------------------------------------------------------------------------- /joint_windows.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | import ( 4 | "fmt" 5 | "path/filepath" 6 | "runtime" 7 | "strings" 8 | "syscall" 9 | "time" 10 | ) 11 | 12 | //传入要打印的信息,拼接好后返回 13 | func joint(prefix, message string, color colorType) string { 14 | now := time.Now().Format("2006/01/02 15:04:05") 15 | filename, funcname, line := getpProcInfo() 16 | s := fmt.Sprint(prefix, ": ", now, " ", filename, ":", line, ":", funcname, ": ", message) 17 | //如果是windows系统彩色打印,需要调试kernel32.dll文件 18 | if isColor { 19 | winKernelOpen(color) 20 | } 21 | return s 22 | } 23 | 24 | func (l mylog) joint(prefix, message string, color colorType) string { 25 | now := time.Now().Format("2006/01/02 15:04:05") 26 | filename, funcname, line := getpProcInfo() 27 | s := fmt.Sprint(prefix, ": ", now, " ", filename, ":", line, ":", funcname, ": ", message) 28 | if l.isColor { 29 | winKernelOpen(color) 30 | } 31 | return s 32 | } 33 | 34 | //传入颜色代码,windows系统开启彩色打印 35 | func winKernelOpen(color colorType) { 36 | kernel32 := syscall.NewLazyDLL("kernel32.dll") 37 | proc := kernel32.NewProc("SetConsoleTextAttribute") 38 | proc.Call(uintptr(syscall.Stdout), uintptr(color)) 39 | } 40 | 41 | //windows系统关闭彩色打印 42 | func winKernelColse() { 43 | kernel32 := syscall.NewLazyDLL("kernel32.dll") 44 | proc := kernel32.NewProc("SetConsoleTextAttribute") 45 | handle, _, _ := proc.Call(uintptr(syscall.Stdout), uintptr(7)) 46 | CloseHandle := kernel32.NewProc("CloseHandle") 47 | CloseHandle.Call(handle) 48 | } 49 | 50 | //获取打印日志的进程信息 51 | func getpProcInfo() (filename, funcname string, line int) { 52 | pc, filename, line, ok := runtime.Caller(3) 53 | if ok { 54 | funcname = runtime.FuncForPC(pc).Name() // main.(*MyStruct).foo 55 | funcname = filepath.Ext(funcname) // .foo 56 | funcname = strings.TrimPrefix(funcname, ".") // foo 57 | filename = filepath.Base(filename) // /full/path/basename.go => basename.go 58 | } 59 | return 60 | } 61 | -------------------------------------------------------------------------------- /log_factory.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | import ( 4 | "errors" 5 | "io" 6 | "io/ioutil" 7 | "log" 8 | "os" 9 | ) 10 | 11 | type mylog struct { 12 | loggers []*log.Logger 13 | isColor bool 14 | } 15 | 16 | //生成一个新的日志对象 17 | func New() mylog { 18 | loggers := []*log.Logger{ 19 | Leveltrace: log.New(os.Stdout, "", 0), 20 | Levelinfo: log.New(os.Stdout, "", 0), 21 | Leveldebug: log.New(os.Stdout, "", 0), 22 | Levelwarn: log.New(os.Stderr, "", 0), 23 | Levelerror: log.New(os.Stderr, "", 0), 24 | Levelpanic: log.New(os.Stderr, "", 0), 25 | Levelfatal: log.New(os.Stderr, "", 0), 26 | } 27 | return mylog{loggers, true} 28 | } 29 | 30 | /* 31 | 隐藏单个日志级别的输出 32 | 日志级别不能超过Levelpanic 33 | */ 34 | func (l mylog) SetLogDiscard(t logType) error { 35 | if t > Levelpanic { 36 | return errors.New("SetLevel err: can't set log level Discard > Levelerror") 37 | } 38 | l.loggers[t].SetOutput(ioutil.Discard) 39 | return nil 40 | } 41 | 42 | //设置隐藏日志等级 43 | //最高设置到Levelpanic 即是低于panic等级的日志都不显示 44 | func (l mylog) SetLogDiscardLevel(t logType) error { 45 | if t > Levelpanic { 46 | return errors.New("SetLevel err: can't set log level Discard more than Levelerror") 47 | } 48 | for i := int(t); i >= 0; i-- { 49 | if i <= 3 { 50 | l.loggers[logType(i)].SetOutput(os.Stdout) 51 | } else { 52 | l.loggers[logType(i)].SetOutput(os.Stderr) 53 | } 54 | } 55 | for i := 0; i < int(t); i++ { 56 | l.loggers[logType(i)].SetOutput(ioutil.Discard) 57 | } 58 | return nil 59 | } 60 | 61 | //是否彩色打印 62 | func (l *mylog) IsColor(iscolor bool) { 63 | l.isColor = iscolor 64 | } 65 | 66 | //设置单个日志级别输出到目标位置 67 | func (l mylog) SetOutput(w io.Writer, t logType) { 68 | l.loggers[t].SetOutput(w) 69 | } 70 | 71 | //设置全部日志级别输出到目的地 72 | func (l mylog) SetOutputAll(w io.Writer) { 73 | for i := range l.loggers { 74 | l.loggers[i].SetOutput(w) 75 | } 76 | } 77 | 78 | //设置指定日志级别及以上的输出到目标位置 79 | func (l mylog) SetOutputAbove(w io.Writer, t logType) { 80 | for i := int(t); i < 7; i++ { 81 | l.loggers[logType(i)].SetOutput(w) 82 | } 83 | } 84 | 85 | //设置指定日志级别及以下的输出到目标位置 86 | func (l mylog) SetOutputBelow(w io.Writer, t logType) { 87 | for i := 0; i <= int(t); i++ { 88 | l.loggers[logType(i)].SetOutput(w) 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /log.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | import ( 4 | "errors" 5 | "io" 6 | "io/ioutil" 7 | "log" 8 | "os" 9 | ) 10 | 11 | /* 12 | 默认设置: 13 | 0 - 2层信息输出到os.stdout 14 | 3 - 6层信息输出到os.stderr 15 | */ 16 | var loggers = []*log.Logger{ 17 | Leveltrace: log.New(os.Stdout, "", 0), 18 | Levelinfo: log.New(os.Stdout, "", 0), 19 | Leveldebug: log.New(os.Stdout, "", 0), 20 | Levelwarn: log.New(os.Stderr, "", 0), 21 | Levelerror: log.New(os.Stderr, "", 0), 22 | Levelpanic: log.New(os.Stderr, "", 0), 23 | Levelfatal: log.New(os.Stderr, "", 0), 24 | } 25 | 26 | //是否彩色打印 27 | func IsColor(iscolor bool) { 28 | isColor = iscolor 29 | } 30 | 31 | //SetLogDiscard隐藏单个日志级别的输出信息 32 | //传入需要隐藏的日志级别,日志级别不能超过Levelpanic 33 | func SetLogDiscard(t logType) error { 34 | if t > Levelpanic { 35 | return errors.New("SetLevel err: can't set log level Discard > Levelerror") 36 | } 37 | loggers[t].SetOutput(ioutil.Discard) 38 | return nil 39 | } 40 | 41 | //SetLogDiscardLevel隐藏多个日志级别输出信息 42 | //传入需要隐藏的日志级别,最高设置到Levelpanic 即是低于panic等级的日志都不显示 43 | func SetLogDiscardLevel(t logType) error { 44 | if t > Levelpanic { 45 | return errors.New("SetLevel err: can't set log level Discard more than Levelerror") 46 | } 47 | for i := int(t); i >= 0; i-- { 48 | if i <= 3 { 49 | loggers[logType(i)].SetOutput(os.Stdout) 50 | } else { 51 | loggers[logType(i)].SetOutput(os.Stderr) 52 | } 53 | } 54 | for i := 0; i < int(t); i++ { 55 | loggers[logType(i)].SetOutput(ioutil.Discard) 56 | } 57 | return nil 58 | } 59 | 60 | //SetOutput设置单个日志级别输出到目标位置 61 | //传入文件的句柄(或者实现了io.Writer接口的对象)与日志级别,则该日志级别的日志将会输出到指定的文件或位置 62 | func SetOutput(w io.Writer, t logType) { 63 | loggers[t].SetOutput(w) 64 | } 65 | 66 | //SetOutputAll设置全部日志级别输出到目标位置 67 | //传入文件的句柄(或者实现了io.Writer接口的对象)与日志级别,则全部日志级别的日志将会输出到指定的文件或位置 68 | func SetOutputAll(w io.Writer) { 69 | for i := range loggers { 70 | loggers[i].SetOutput(w) 71 | } 72 | } 73 | 74 | //SetOutputAbove设置指定日志级别及以上的输出到目标位置 75 | //传入文件的句柄(或者实现了io.Writer接口的对象)与日志级别,则该日志级别以上的日志(包括此日志级别)将会输出到指定的文件或位置 76 | func SetOutputAbove(w io.Writer, t logType) { 77 | for i := int(t); i < 7; i++ { 78 | loggers[logType(i)].SetOutput(w) 79 | } 80 | } 81 | 82 | //SetOutputBelow设置指定日志级别及以下的输出到目标位置 83 | //传入文件的句柄(或者实现了io.Writer接口的对象)与日志级别,则该日志级别以下的日志(包括此日志级别)将会输出到指定的文件或位置 84 | func SetOutputBelow(w io.Writer, t logType) { 85 | for i := 0; i <= int(t); i++ { 86 | loggers[logType(i)].SetOutput(w) 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # golang日志小工具 2 | 3 | [![](https://travis-ci.org/corgi-kx/logcustom.svg?branch=master)](https://travis-ci.org/corgi-kx) 4 |
5 | 6 | 花了几天时间写了个golang日志小工具,基本满足日常开发需求 7 | 8 | **特点** 9 | - 支持定向输出日志到指定文件 10 | - 支持隐藏调试信息 11 | - 支持彩色打印(windows/linux/mac均支持) 12 | - 显示输出日志的类名、函数/方法名 13 | 14 |
15 | 16 | **Feature** 17 | - Supports directing output logs to specified files 18 | - Support for hiding debugging information 19 | - Support color printing (Windows/Linux/MAC) 20 | - Displays the class name, function/method name of the output log 21 | 22 |
23 | 24 | **源码地址:** 25 | [https://github.com/corgi-kx/logcustom](https://github.com/corgi-kx/logcustom) 26 | 27 |
28 | 29 | 30 | ### 示例 Example 31 |
32 | 33 | 打印效果: 34 | 35 | [![Example Output](example/images/display.png)](example/example.go) 36 | 37 | [使用示范](example/example.go): 38 | ```go 39 | package main 40 | 41 | import ( 42 | log "github.com/corgi-kx/logcustom" 43 | "os" 44 | ) 45 | 46 | func main() { 47 | //直接调用log,则是全局使用 48 | log.Info("Write something you want to print !") 49 | log.Warn("Write something you want to print !") 50 | log.Trace("Write something you want to print !") 51 | log.Debug("Write something you want to print !") 52 | log.Error("Write something you want to print !") 53 | 54 | //设置输出信息隐藏等级 55 | err := log.SetLogDiscardLevel(log.Leveldebug) 56 | if err != nil { 57 | log.Error(err) 58 | } 59 | 60 | log.Info("SetLogDiscardLevel test !") //INFO不会被打印 61 | log.Debug("SetLogDiscardLevel test !") 62 | log.Warn("SetLogDiscardLevel test !") 63 | 64 | //创建新的日志对象 65 | mylog := log.New() 66 | file, err := os.OpenFile("log.txt", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666) 67 | if err != nil { 68 | log.Error(err) 69 | } 70 | //将日志信息输出到指定文件 71 | mylog.SetOutputAbove(file, log.Levelwarn) //WARN及WARN以上级别的日志会输出到指定文件 72 | mylog.Trace("SetOutputAll test !") 73 | mylog.Info("SetOutputAll test !") 74 | mylog.Debug("SetOutputAll test !") 75 | mylog.Warn("SetOutputAll test !") 76 | mylog.Error("SetOutputAll test !") 77 | } 78 | 79 | ``` 80 |

81 | 82 | ### 安装 Installing 83 |
84 | 85 | ```shell 86 | go get github.com/corgi-kx/logcustom 87 | ``` 88 | 安装成功后,日志包就可以使用了,包位置在 89 | ```shell 90 | $GOPATH/src/github.com/corgi-kx/logcustom 91 | ``` 92 | 93 | 您可以使用 `go get -u` 对此包进行更新 94 |

95 | 96 | ### 文档 Documentation 97 |
98 | 99 | 您可以使用以下命令来查看使用文档 100 | ```shell 101 | godoc github.com/corgi-kx/logcustom 102 | ``` 103 | 或者在终端输入如下命令: 104 | ```shell 105 | godoc -http=:6060 106 | ``` 107 | 在浏览器访问此界面 108 | ```shell 109 | http://127.0.0.1:6060/pkg/github.com/corgi-kx/logcustom/ 110 | ``` 111 | -------------------------------------------------------------------------------- /log_test.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | import ( 4 | "fmt" 5 | "github.com/stretchr/testify/assert" 6 | "log" 7 | "os" 8 | "strconv" 9 | "sync" 10 | "testing" 11 | "time" 12 | ) 13 | 14 | func TestLogPrint(t *testing.T) { 15 | t.Log("测试打印效果") 16 | { 17 | IsColor(false) 18 | Warn("测试打印效果Warn") 19 | Info("测试打印效果Info") 20 | Debug("测试打印效果Info") 21 | Trace("测试打印效果Trace") 22 | Error("测试打印效果Error") 23 | //Panic("测试打印效果Panic") 24 | //Fatal("测试打印效果Fatal") 25 | IsColor(true) 26 | Trace("测试打印效果Trace") 27 | Tracef("%s", "测试打印效果Tracef") 28 | Info("测试打印效果Info") 29 | Infof("%s", "测试打印效果Infof") 30 | Debug("测试打印效果Info") 31 | Debugf("%s", "测试打印效果Debugf") 32 | Warn("测试打印效果Warn") 33 | Warnf("%s", "测试打印效果Warnf") 34 | Error("测试打印效果Error") 35 | Errorf("%s", "测试打印效果Errorf") 36 | SetLogDiscard(Levelwarn) 37 | Warn("测试打印效果Warn") 38 | Warnf("%s", "测试打印效果Warnf") 39 | //Fatal("测试打印效果Fatal") 40 | //Panic("测试打印效果Panic") 41 | mylog := New() 42 | mylog.Trace("mylog测试打印效果Trace") 43 | mylog.Tracef("%s", "mylog测试打印效果Tracef") 44 | mylog.Info("mylog测试打印效果Info") 45 | mylog.Infof("%s", "mylog测试打印效果Infof") 46 | mylog.Debug("mylog测试打印效果Info") 47 | mylog.Debugf("%s", "mylog测试打印效果Debugf") 48 | mylog.Warn("mylog测试打印效果Warn") 49 | mylog.Warnf("%s", "mylog测试打印效果Warnf") 50 | mylog.Error("mylog测试打印效果Error") 51 | mylog.Errorf("%s", "mylog测试打印效果Errorf") 52 | mylog2 := New() 53 | mylog2.IsColor(true) 54 | mylog2.SetLogDiscardLevel(Levelerror) 55 | mylog2.Trace("mylog2测试打印效果Trace") 56 | mylog2.Tracef("%s", "mylog2测试打印效果Tracef") 57 | mylog2.Info("测试打印效果Info") 58 | mylog2.Infof("%s", "mylog2测试打印效果Infof") 59 | mylog2.Debug("测试打印效果Debug") 60 | mylog2.Debugf("%s", "mylog2测试打印效果Debugf") 61 | mylog2.Warn("测试打印效果Warn") 62 | mylog2.Warnf("%s", "mylog2测试打印效果Warnf") 63 | mylog2.Error("测试打印效果Error") 64 | mylog2.Errorf("%s", "mylog2测试打印效果Errorf") 65 | } 66 | } 67 | 68 | func TestLogMultithread(t *testing.T) { 69 | t.Log("测试日志是否线程安全") 70 | { 71 | wait := sync.WaitGroup{} 72 | wait.Add(200) 73 | for i := 0; i < 100; i++ { 74 | go func(i int) { 75 | for j := 0; j <= 10; j++ { 76 | Tracef("1试试可以正常打印吗!这是第%d次 第%d次!", i, j) 77 | } 78 | wait.Done() 79 | }(i) 80 | } 81 | for i := 0; i < 100; i++ { 82 | go func(i int) { 83 | for j := 0; j <= 10; j++ { 84 | Tracef("2试试可以正常打印吗!这是第%d次 第%d次!", i, j) 85 | } 86 | wait.Done() 87 | }(i) 88 | } 89 | wait.Wait() 90 | } 91 | } 92 | 93 | func TestMapVSArray(t *testing.T) { 94 | t.Log("测试字典与切片,使用哪个性能更好") 95 | count := 1000000 96 | 97 | loggerMap := map[logType]*log.Logger{ 98 | Leveltrace: log.New(os.Stdout, "", 0), 99 | Levelinfo: log.New(os.Stdout, "", 0), 100 | Leveldebug: log.New(os.Stdout, "", 0), 101 | Levelwarn: log.New(os.Stderr, "", 0), 102 | Levelerror: log.New(os.Stderr, "", 0), 103 | Levelpanic: log.New(os.Stderr, "", 0), 104 | Levelfatal: log.New(os.Stderr, "", 0), 105 | } 106 | 107 | loggerArr := []*log.Logger{ 108 | Leveltrace: log.New(os.Stdout, "", 0), 109 | Levelinfo: log.New(os.Stdout, "", 0), 110 | Leveldebug: log.New(os.Stdout, "", 0), 111 | Levelwarn: log.New(os.Stderr, "", 0), 112 | Levelerror: log.New(os.Stderr, "", 0), 113 | Levelpanic: log.New(os.Stderr, "", 0), 114 | Levelfatal: log.New(os.Stderr, "", 0), 115 | } 116 | 117 | fmt.Println("---------------count:", count) 118 | 119 | st := time.Now() 120 | for i := 0; i < count; i++ { 121 | assert.NotNil(t, loggerMap[Leveltrace]) 122 | assert.NotNil(t, loggerMap[Levelinfo]) 123 | assert.NotNil(t, loggerMap[Leveldebug]) 124 | assert.NotNil(t, loggerMap[Levelwarn]) 125 | assert.NotNil(t, loggerMap[Levelerror]) 126 | assert.NotNil(t, loggerMap[Levelpanic]) 127 | assert.NotNil(t, loggerMap[Levelfatal]) 128 | } 129 | fmt.Println("map:", time.Since(st)) 130 | 131 | st = time.Now() 132 | for i := 0; i < count; i++ { 133 | assert.NotNil(t, loggerArr[Leveltrace]) 134 | assert.NotNil(t, loggerArr[Levelinfo]) 135 | assert.NotNil(t, loggerArr[Leveldebug]) 136 | assert.NotNil(t, loggerArr[Levelwarn]) 137 | assert.NotNil(t, loggerArr[Levelerror]) 138 | assert.NotNil(t, loggerArr[Levelpanic]) 139 | assert.NotNil(t, loggerArr[Levelfatal]) 140 | } 141 | fmt.Println("array:", time.Since(st)) 142 | } 143 | 144 | func TestColorCode(t *testing.T) { 145 | t.Log("测试颜色代码") 146 | { 147 | for i := 30; i <= 40; i++ { 148 | fmt.Printf("\033[%sm%s\033[0m\n", strconv.Itoa(i), "some thins you want to print out.") 149 | } 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /print_darwin.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | import "fmt" 4 | 5 | //Trace级别的打印信息,输入要打印的内容,会自动换行 6 | func Trace(v ...interface{}) { 7 | trace := loggers[Leveltrace] 8 | s := fmt.Sprint(v...) 9 | message := joint(lTrace, s, colorGreen) 10 | trace.Println(message) 11 | } 12 | 13 | //Trace级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 14 | func Tracef(format string, v ...interface{}) { 15 | trace := loggers[Leveltrace] 16 | s := fmt.Sprintf(format, v...) 17 | message := joint(lTrace, s, colorGreen) 18 | trace.Println(message) 19 | } 20 | 21 | //Info级别的打印信息,输入要打印的内容,会自动换行 22 | func Info(v ...interface{}) { 23 | info := loggers[Levelinfo] 24 | s := fmt.Sprint(v...) 25 | message := joint(lInfo, s, colorBlue) 26 | info.Println(message) 27 | } 28 | 29 | //Infof级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 30 | func Infof(format string, v ...interface{}) { 31 | info := loggers[Levelinfo] 32 | s := fmt.Sprintf(format, v...) 33 | message := joint(lInfo, s, colorBlue) 34 | info.Println(message) 35 | } 36 | 37 | //Debug级别的打印信息,输入要打印的内容,会自动换行 38 | func Debug(v ...interface{}) { 39 | debug := loggers[Leveldebug] 40 | s := fmt.Sprint(v...) 41 | message := joint(lDebug, s, colorDarkblue) 42 | debug.Println(message) 43 | } 44 | 45 | //Debug级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 46 | func Debugf(format string, v ...interface{}) { 47 | debug := loggers[Leveldebug] 48 | s := fmt.Sprintf(format, v...) 49 | message := joint(lDebug, s, colorDarkblue) 50 | debug.Println(message) 51 | } 52 | 53 | //Warn级别的打印信息,输入要打印的内容,会自动换行 54 | func Warn(v ...interface{}) { 55 | warn := loggers[Levelwarn] 56 | s := fmt.Sprint(v...) 57 | message := joint(lWarn, s, colorYellow) 58 | warn.Println(message) 59 | } 60 | 61 | //Warn级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 62 | func Warnf(format string, v ...interface{}) { 63 | warn := loggers[Levelwarn] 64 | s := fmt.Sprintf(format, v...) 65 | message := joint(lWarn, s, colorYellow) 66 | warn.Println(message) 67 | } 68 | 69 | //Error级别的打印信息,输入要打印的内容,会自动换行 70 | func Error(v ...interface{}) { 71 | e := loggers[Levelerror] 72 | s := fmt.Sprint(v...) 73 | message := joint(lError, s, colorRed) 74 | e.Println(message) 75 | } 76 | 77 | //Errorf级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 78 | func Errorf(format string, v ...interface{}) { 79 | e := loggers[Levelerror] 80 | s := fmt.Sprintf(format, v...) 81 | message := joint(lError, s, colorRed) 82 | e.Println(message) 83 | } 84 | 85 | //Panic级别的打印信息,输入要打印的内容,会自动换行 86 | // 执行Panic,递归执行每层的defer后中断程序 87 | func Panic(v ...interface{}) { 88 | p := loggers[Levelpanic] 89 | s := fmt.Sprint(v...) 90 | message := joint(lPanic, s, colorRed) 91 | p.Panicln(message) 92 | } 93 | 94 | //Panicf级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容 95 | // 输出错误信息后,执行Panic(),递归执行每层的defer后中断程序 96 | func Panicf(format string, v ...interface{}) { 97 | p := loggers[Levelpanic] 98 | s := fmt.Sprintf(format, v...) 99 | message := joint(lPanic, s, colorRed) 100 | p.Panicln(message) 101 | } 102 | 103 | //Fatal级别的打印信息,输入要打印的内容,会自动换行 104 | // 输出错误信息后,直接执行os.exit(1)中断程序 105 | func Fatal(v ...interface{}) { 106 | falat := loggers[Levelfatal] 107 | s := fmt.Sprint(v...) 108 | message := joint(lFatal, s, colorPurple) 109 | falat.Fatalln(message) 110 | } 111 | 112 | //Fatal级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容 113 | // 输出错误信息后,直接执行os.exit(1)中断程序 114 | func Fatalf(format string, v ...interface{}) { 115 | falat := loggers[Levelfatal] 116 | s := fmt.Sprintf(format, v...) 117 | message := joint(lFatal, s, colorPurple) 118 | falat.Fatalln(message) 119 | } 120 | 121 | func (l mylog) Trace(v ...interface{}) { 122 | trace := l.loggers[Leveltrace] 123 | s := fmt.Sprint(v...) 124 | message := l.joint(lTrace, s, colorGreen) 125 | trace.Println(message) 126 | } 127 | 128 | func (l mylog) Tracef(format string, v ...interface{}) { 129 | trace := l.loggers[Leveltrace] 130 | s := fmt.Sprintf(format, v...) 131 | message := l.joint(lTrace, s, colorGreen) 132 | trace.Println(message) 133 | } 134 | 135 | func (l mylog) Info(v ...interface{}) { 136 | info := l.loggers[Levelinfo] 137 | s := fmt.Sprint(v...) 138 | message := l.joint(lInfo, s, colorBlue) 139 | info.Println(message) 140 | } 141 | 142 | func (l mylog) Infof(format string, v ...interface{}) { 143 | info := l.loggers[Levelinfo] 144 | s := fmt.Sprintf(format, v...) 145 | message := l.joint(lInfo, s, colorBlue) 146 | info.Println(message) 147 | } 148 | 149 | func (l mylog) Debug(v ...interface{}) { 150 | debug := l.loggers[Leveldebug] 151 | s := fmt.Sprint(v...) 152 | message := l.joint(lDebug, s, colorDarkblue) 153 | debug.Println(message) 154 | } 155 | 156 | func (l mylog) Debugf(format string, v ...interface{}) { 157 | debug := l.loggers[Leveldebug] 158 | s := fmt.Sprintf(format, v...) 159 | message := l.joint(lDebug, s, colorDarkblue) 160 | debug.Println(message) 161 | } 162 | 163 | func (l mylog) Warn(v ...interface{}) { 164 | warn := l.loggers[Levelwarn] 165 | s := fmt.Sprint(v...) 166 | message := l.joint(lWarn, s, colorYellow) 167 | warn.Println(message) 168 | } 169 | 170 | func (l mylog) Warnf(format string, v ...interface{}) { 171 | warn := l.loggers[Levelwarn] 172 | s := fmt.Sprintf(format, v...) 173 | message := l.joint(lWarn, s, colorYellow) 174 | warn.Println(message) 175 | } 176 | 177 | func (l mylog) Error(v ...interface{}) { 178 | e := l.loggers[Levelerror] 179 | s := fmt.Sprint(v...) 180 | message := l.joint(lError, s, colorRed) 181 | e.Println(message) 182 | } 183 | 184 | func (l mylog) Errorf(format string, v ...interface{}) { 185 | e := l.loggers[Levelerror] 186 | s := fmt.Sprintf(format, v...) 187 | message := l.joint(lError, s, colorRed) 188 | e.Println(message) 189 | } 190 | 191 | func (l mylog) Panic(v ...interface{}) { 192 | p := l.loggers[Levelpanic] 193 | s := fmt.Sprint(v...) 194 | message := l.joint(lPanic, s, colorRed) 195 | p.Panicln(message) 196 | } 197 | 198 | func (l mylog) Panicf(format string, v ...interface{}) { 199 | p := l.loggers[Levelpanic] 200 | s := fmt.Sprintf(format, v...) 201 | message := l.joint(lPanic, s, colorRed) 202 | p.Panicln(message) 203 | } 204 | 205 | func (l mylog) Fatal(v ...interface{}) { 206 | falat := l.loggers[Levelfatal] 207 | s := fmt.Sprint(v...) 208 | message := l.joint(lFatal, s, colorPurple) 209 | falat.Fatalln(message) 210 | } 211 | 212 | func (l mylog) Fatalf(format string, v ...interface{}) { 213 | falat := l.loggers[Levelfatal] 214 | s := fmt.Sprintf(format, v...) 215 | message := l.joint(lFatal, s, colorPurple) 216 | falat.Fatalln(message) 217 | } 218 | -------------------------------------------------------------------------------- /print_linux.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | import "fmt" 4 | 5 | //Trace级别的打印信息,输入要打印的内容,会自动换行 6 | func Trace(v ...interface{}) { 7 | trace := loggers[Leveltrace] 8 | s := fmt.Sprint(v...) 9 | message := joint(lTrace, s, colorGreen) 10 | trace.Println(message) 11 | } 12 | 13 | //Trace级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 14 | func Tracef(format string, v ...interface{}) { 15 | trace := loggers[Leveltrace] 16 | s := fmt.Sprintf(format, v...) 17 | message := joint(lTrace, s, colorGreen) 18 | trace.Println(message) 19 | } 20 | 21 | //Info级别的打印信息,输入要打印的内容,会自动换行 22 | func Info(v ...interface{}) { 23 | info := loggers[Levelinfo] 24 | s := fmt.Sprint(v...) 25 | message := joint(lInfo, s, colorBlue) 26 | info.Println(message) 27 | } 28 | 29 | //Infof级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 30 | func Infof(format string, v ...interface{}) { 31 | info := loggers[Levelinfo] 32 | s := fmt.Sprintf(format, v...) 33 | message := joint(lInfo, s, colorBlue) 34 | info.Println(message) 35 | } 36 | 37 | //Debug级别的打印信息,输入要打印的内容,会自动换行 38 | func Debug(v ...interface{}) { 39 | debug := loggers[Leveldebug] 40 | s := fmt.Sprint(v...) 41 | message := joint(lDebug, s, colorDarkblue) 42 | debug.Println(message) 43 | } 44 | 45 | //Debug级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 46 | func Debugf(format string, v ...interface{}) { 47 | debug := loggers[Leveldebug] 48 | s := fmt.Sprintf(format, v...) 49 | message := joint(lDebug, s, colorDarkblue) 50 | debug.Println(message) 51 | } 52 | 53 | //Warn级别的打印信息,输入要打印的内容,会自动换行 54 | func Warn(v ...interface{}) { 55 | warn := loggers[Levelwarn] 56 | s := fmt.Sprint(v...) 57 | message := joint(lWarn, s, colorYellow) 58 | warn.Println(message) 59 | } 60 | 61 | //Warn级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 62 | func Warnf(format string, v ...interface{}) { 63 | warn := loggers[Levelwarn] 64 | s := fmt.Sprintf(format, v...) 65 | message := joint(lWarn, s, colorYellow) 66 | warn.Println(message) 67 | } 68 | 69 | //Error级别的打印信息,输入要打印的内容,会自动换行 70 | func Error(v ...interface{}) { 71 | e := loggers[Levelerror] 72 | s := fmt.Sprint(v...) 73 | message := joint(lError, s, colorRed) 74 | e.Println(message) 75 | } 76 | 77 | //Errorf级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 78 | func Errorf(format string, v ...interface{}) { 79 | e := loggers[Levelerror] 80 | s := fmt.Sprintf(format, v...) 81 | message := joint(lError, s, colorRed) 82 | e.Println(message) 83 | } 84 | 85 | //Panic级别的打印信息,输入要打印的内容,会自动换行 86 | // 执行Panic,递归执行每层的defer后中断程序 87 | func Panic(v ...interface{}) { 88 | p := loggers[Levelpanic] 89 | s := fmt.Sprint(v...) 90 | message := joint(lPanic, s, colorRed) 91 | p.Panicln(message) 92 | } 93 | 94 | //Panicf级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容 95 | // 输出错误信息后,执行Panic(),递归执行每层的defer后中断程序 96 | func Panicf(format string, v ...interface{}) { 97 | p := loggers[Levelpanic] 98 | s := fmt.Sprintf(format, v...) 99 | message := joint(lPanic, s, colorRed) 100 | p.Panicln(message) 101 | } 102 | 103 | //Fatal级别的打印信息,输入要打印的内容,会自动换行 104 | // 输出错误信息后,直接执行os.exit(1)中断程序 105 | func Fatal(v ...interface{}) { 106 | falat := loggers[Levelfatal] 107 | s := fmt.Sprint(v...) 108 | message := joint(lFatal, s, colorPurple) 109 | falat.Fatalln(message) 110 | } 111 | 112 | //Fatal级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容 113 | // 输出错误信息后,直接执行os.exit(1)中断程序 114 | func Fatalf(format string, v ...interface{}) { 115 | falat := loggers[Levelfatal] 116 | s := fmt.Sprintf(format, v...) 117 | message := joint(lFatal, s, colorPurple) 118 | falat.Fatalln(message) 119 | } 120 | 121 | func (l mylog) Trace(v ...interface{}) { 122 | trace := l.loggers[Leveltrace] 123 | s := fmt.Sprint(v...) 124 | message := l.joint(lTrace, s, colorGreen) 125 | trace.Println(message) 126 | } 127 | 128 | func (l mylog) Tracef(format string, v ...interface{}) { 129 | trace := l.loggers[Leveltrace] 130 | s := fmt.Sprintf(format, v...) 131 | message := l.joint(lTrace, s, colorGreen) 132 | trace.Println(message) 133 | } 134 | 135 | func (l mylog) Info(v ...interface{}) { 136 | info := l.loggers[Levelinfo] 137 | s := fmt.Sprint(v...) 138 | message := l.joint(lInfo, s, colorBlue) 139 | info.Println(message) 140 | } 141 | 142 | func (l mylog) Infof(format string, v ...interface{}) { 143 | info := l.loggers[Levelinfo] 144 | s := fmt.Sprintf(format, v...) 145 | message := l.joint(lInfo, s, colorBlue) 146 | info.Println(message) 147 | } 148 | 149 | func (l mylog) Debug(v ...interface{}) { 150 | debug := l.loggers[Leveldebug] 151 | s := fmt.Sprint(v...) 152 | message := l.joint(lDebug, s, colorDarkblue) 153 | debug.Println(message) 154 | } 155 | 156 | func (l mylog) Debugf(format string, v ...interface{}) { 157 | debug := l.loggers[Leveldebug] 158 | s := fmt.Sprintf(format, v...) 159 | message := l.joint(lDebug, s, colorDarkblue) 160 | debug.Println(message) 161 | } 162 | 163 | func (l mylog) Warn(v ...interface{}) { 164 | warn := l.loggers[Levelwarn] 165 | s := fmt.Sprint(v...) 166 | message := l.joint(lWarn, s, colorYellow) 167 | warn.Println(message) 168 | } 169 | 170 | func (l mylog) Warnf(format string, v ...interface{}) { 171 | warn := l.loggers[Levelwarn] 172 | s := fmt.Sprintf(format, v...) 173 | message := l.joint(lWarn, s, colorYellow) 174 | warn.Println(message) 175 | } 176 | 177 | func (l mylog) Error(v ...interface{}) { 178 | e := l.loggers[Levelerror] 179 | s := fmt.Sprint(v...) 180 | message := l.joint(lError, s, colorRed) 181 | e.Println(message) 182 | } 183 | 184 | func (l mylog) Errorf(format string, v ...interface{}) { 185 | e := l.loggers[Levelerror] 186 | s := fmt.Sprintf(format, v...) 187 | message := l.joint(lError, s, colorRed) 188 | e.Println(message) 189 | } 190 | 191 | func (l mylog) Panic(v ...interface{}) { 192 | p := l.loggers[Levelpanic] 193 | s := fmt.Sprint(v...) 194 | message := l.joint(lPanic, s, colorRed) 195 | p.Panicln(message) 196 | } 197 | 198 | func (l mylog) Panicf(format string, v ...interface{}) { 199 | p := l.loggers[Levelpanic] 200 | s := fmt.Sprintf(format, v...) 201 | message := l.joint(lPanic, s, colorRed) 202 | p.Panicln(message) 203 | } 204 | 205 | func (l mylog) Fatal(v ...interface{}) { 206 | falat := l.loggers[Levelfatal] 207 | s := fmt.Sprint(v...) 208 | message := l.joint(lFatal, s, colorPurple) 209 | falat.Fatalln(message) 210 | } 211 | 212 | func (l mylog) Fatalf(format string, v ...interface{}) { 213 | falat := l.loggers[Levelfatal] 214 | s := fmt.Sprintf(format, v...) 215 | message := l.joint(lFatal, s, colorPurple) 216 | falat.Fatalln(message) 217 | } 218 | -------------------------------------------------------------------------------- /print_windows.go: -------------------------------------------------------------------------------- 1 | package log 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | ) 7 | 8 | //Trace级别的打印信息,输入要打印的内容,会自动换行 9 | func Trace(v ...interface{}) { 10 | trace := loggers[Leveltrace] 11 | s := fmt.Sprint(v...) 12 | var message string 13 | message = joint(lTrace, s, WinColorGreen) 14 | trace.Println(message) 15 | winKernelColse() 16 | } 17 | 18 | //Trace级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 19 | func Tracef(format string, v ...interface{}) { 20 | trace := loggers[Leveltrace] 21 | s := fmt.Sprintf(format, v...) 22 | var message string 23 | message = joint(lTrace, s, WinColorGreen) 24 | trace.Println(message) 25 | winKernelColse() 26 | } 27 | 28 | //Info级别的打印信息,输入要打印的内容,会自动换行 29 | func Info(v ...interface{}) { 30 | info := loggers[Levelinfo] 31 | s := fmt.Sprint(v...) 32 | var message string 33 | message = joint(lInfo, s, WinColorBlue) 34 | info.Println(message) 35 | winKernelColse() 36 | } 37 | 38 | //Infof级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 39 | func Infof(format string, v ...interface{}) { 40 | info := loggers[Levelinfo] 41 | s := fmt.Sprintf(format, v...) 42 | var message string 43 | message = joint(lInfo, s, WinColorBlue) 44 | info.Println(message) 45 | winKernelColse() 46 | } 47 | 48 | //Debug级别的打印信息,输入要打印的内容,会自动换行 49 | func Debug(v ...interface{}) { 50 | debug := loggers[Leveldebug] 51 | s := fmt.Sprint(v...) 52 | var message string 53 | message = joint(lDebug, s, WinColorDarkblue) 54 | debug.Println(message) 55 | winKernelColse() 56 | } 57 | 58 | //Debug级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 59 | func Debugf(format string, v ...interface{}) { 60 | debug := loggers[Leveldebug] 61 | s := fmt.Sprintf(format, v...) 62 | var message string 63 | message = joint(lDebug, s, WinColorDarkblue) 64 | debug.Println(message) 65 | winKernelColse() 66 | } 67 | 68 | //Warn级别的打印信息,输入要打印的内容,会自动换行 69 | func Warn(v ...interface{}) { 70 | warn := loggers[Levelwarn] 71 | s := fmt.Sprint(v...) 72 | var message string 73 | message = joint(lWarn, s, WinColorYellow) 74 | warn.Println(message) 75 | winKernelColse() 76 | } 77 | 78 | //Warn级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 79 | func Warnf(format string, v ...interface{}) { 80 | warn := loggers[Levelwarn] 81 | s := fmt.Sprintf(format, v...) 82 | var message string 83 | message = joint(lWarn, s, WinColorYellow) 84 | warn.Println(message) 85 | winKernelColse() 86 | } 87 | 88 | //Error级别的打印信息,输入要打印的内容,会自动换行 89 | func Error(v ...interface{}) { 90 | e := loggers[Levelerror] 91 | s := fmt.Sprint(v...) 92 | var message string 93 | message = joint(lError, s, WinColorRed) 94 | e.Println(message) 95 | winKernelColse() 96 | } 97 | 98 | //Errorf级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容,类似fmt.Printf 99 | func Errorf(format string, v ...interface{}) { 100 | e := loggers[Levelerror] 101 | s := fmt.Sprintf(format, v...) 102 | var message string 103 | message = joint(lError, s, WinColorRed) 104 | e.Println(message) 105 | winKernelColse() 106 | } 107 | 108 | //Panic级别的打印信息,输入要打印的内容,会自动换行 109 | // 执行Panic,递归执行每层的defer后中断程序 110 | func Panic(v ...interface{}) { 111 | p := loggers[Levelpanic] 112 | s := fmt.Sprint(v...) 113 | var message string 114 | message = joint(lPanic, s, WinColorPurple) 115 | defer winKernelColse() 116 | p.Panicln(message) 117 | } 118 | 119 | //Panicf级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容 120 | // 输出错误信息后,执行Panic(),递归执行每层的defer后中断程序 121 | func Panicf(format string, v ...interface{}) { 122 | p := loggers[Levelpanic] 123 | s := fmt.Sprintf(format, v...) 124 | var message string 125 | message = joint(lPanic, s, WinColorPurple) 126 | defer winKernelColse() 127 | p.Panicln(message) 128 | } 129 | 130 | //Fatal级别的打印信息,输入要打印的内容,会自动换行 131 | // 输出错误信息后,直接执行os.exit(1)中断程序 132 | func Fatal(v ...interface{}) { 133 | falat := loggers[Levelfatal] 134 | s := fmt.Sprint(v...) 135 | var message string 136 | message = joint(lFatal, s, WinColorPurple) 137 | falat.Println(message) 138 | winKernelColse() 139 | os.Exit(1) 140 | } 141 | 142 | //Fatal级别的打印信息,第一个参数输入格式,第二个参数输入要打印的内容 143 | // 输出错误信息后,直接执行os.exit(1)中断程序 144 | func Fatalf(format string, v ...interface{}) { 145 | falat := loggers[Levelfatal] 146 | s := fmt.Sprintf(format, v...) 147 | var message string 148 | message = joint(lFatal, s, WinColorPurple) 149 | falat.Println(message) 150 | winKernelColse() 151 | os.Exit(1) 152 | } 153 | 154 | func (l mylog) Trace(v ...interface{}) { 155 | trace := l.loggers[Leveltrace] 156 | s := fmt.Sprint(v...) 157 | var message string 158 | message = l.joint(lTrace, s, WinColorGreen) 159 | trace.Println(message) 160 | winKernelColse() 161 | } 162 | 163 | func (l mylog) Tracef(format string, v ...interface{}) { 164 | trace := l.loggers[Leveltrace] 165 | s := fmt.Sprint(v...) 166 | var message string 167 | message = l.joint(lTrace, s, WinColorGreen) 168 | defer winKernelColse() 169 | trace.Println(message) 170 | } 171 | 172 | func (l mylog) Info(v ...interface{}) { 173 | info := l.loggers[Levelinfo] 174 | s := fmt.Sprint(v...) 175 | var message string 176 | message = l.joint(lInfo, s, WinColorBlue) 177 | info.Println(message) 178 | winKernelColse() 179 | } 180 | 181 | func (l mylog) Infof(format string, v ...interface{}) { 182 | info := l.loggers[Levelinfo] 183 | s := fmt.Sprint(v...) 184 | var message string 185 | message = l.joint(lInfo, s, WinColorBlue) 186 | info.Println(message) 187 | winKernelColse() 188 | } 189 | 190 | func (l mylog) Debug(v ...interface{}) { 191 | debug := l.loggers[Leveldebug] 192 | s := fmt.Sprint(v...) 193 | var message string 194 | message = l.joint(lDebug, s, WinColorDarkblue) 195 | debug.Println(message) 196 | winKernelColse() 197 | } 198 | 199 | func (l mylog) Debugf(format string, v ...interface{}) { 200 | debug := l.loggers[Leveldebug] 201 | s := fmt.Sprint(v...) 202 | var message string 203 | message = l.joint(lDebug, s, WinColorDarkblue) 204 | debug.Println(message) 205 | winKernelColse() 206 | } 207 | 208 | func (l mylog) Warn(v ...interface{}) { 209 | warn := l.loggers[Levelwarn] 210 | s := fmt.Sprint(v...) 211 | var message string 212 | message = l.joint(lWarn, s, WinColorYellow) 213 | warn.Println(message) 214 | winKernelColse() 215 | } 216 | 217 | func (l mylog) Warnf(format string, v ...interface{}) { 218 | warn := l.loggers[Levelwarn] 219 | s := fmt.Sprint(v...) 220 | var message string 221 | message = l.joint(lWarn, s, WinColorYellow) 222 | warn.Println(message) 223 | winKernelColse() 224 | } 225 | 226 | func (l mylog) Error(v ...interface{}) { 227 | e := l.loggers[Levelerror] 228 | s := fmt.Sprint(v...) 229 | var message string 230 | message = l.joint(lError, s, WinColorRed) 231 | e.Println(message) 232 | winKernelColse() 233 | } 234 | 235 | func (l mylog) Errorf(format string, v ...interface{}) { 236 | e := l.loggers[Levelerror] 237 | s := fmt.Sprint(v...) 238 | var message string 239 | message = l.joint(lError, s, WinColorRed) 240 | e.Println(message) 241 | winKernelColse() 242 | } 243 | 244 | func (l mylog) Panic(v ...interface{}) { 245 | p := l.loggers[Levelpanic] 246 | s := fmt.Sprint(v...) 247 | var message string 248 | message = l.joint(lPanic, s, WinColorPurple) 249 | defer winKernelColse() 250 | p.Panicln(message) 251 | } 252 | 253 | func (l mylog) Panicf(format string, v ...interface{}) { 254 | p := l.loggers[Levelpanic] 255 | s := fmt.Sprint(v...) 256 | var message string 257 | message = l.joint(lPanic, s, WinColorPurple) 258 | defer winKernelColse() 259 | p.Panicln(message) 260 | } 261 | 262 | func (l mylog) Fatal(v ...interface{}) { 263 | falat := l.loggers[Levelfatal] 264 | s := fmt.Sprint(v...) 265 | var message string 266 | message = l.joint(lFatal, s, WinColorPurple) 267 | falat.Println(message) 268 | winKernelColse() 269 | os.Exit(1) 270 | } 271 | 272 | func (l mylog) Fatalf(format string, v ...interface{}) { 273 | falat := l.loggers[Levelfatal] 274 | s := fmt.Sprint(v...) 275 | var message string 276 | message = l.joint(lFatal, s, WinColorPurple) 277 | falat.Println(message) 278 | winKernelColse() 279 | os.Exit(1) 280 | } 281 | --------------------------------------------------------------------------------