package logger import ( "fmt" "io" "log" "os" "path" "runtime/debug" "strings" "time" ) var stdlogger *log.Logger var errlogger *log.Logger func init() { binpath, _ := os.Executable() binname := path.Base(strings.ReplaceAll(binpath, "\\", "/")) logpath := os.Getenv("AYO_LOGGER_FILE_PATH") if len(logpath) == 0 { stdlogger = log.New(os.Stdout, "", log.LstdFlags) errlogger = log.New(os.Stderr, "", log.LstdFlags) } else { ext := path.Ext(binname) if len(ext) > 0 { binname = binname[:len(binname)-len(ext)] } if _, err := os.Stat(logpath); os.IsNotExist(err) { os.Mkdir("logs", 0777) } now := time.Now() logFile, err := os.Create(fmt.Sprintf("%s/%s_%s.log", logpath, binname, now.Format("2006-01-02T15-04-05"))) if err != nil { panic(err) } stdlogger = log.New(io.MultiWriter(os.Stdout, logFile), "", log.LstdFlags) if fi, err := os.Stat(binpath); err == nil { stdlogger.Println(fi.Name(), fi.ModTime()) } logFile, err = os.Create(fmt.Sprintf("%s/%s_%s.err", logpath, binname, now.Format("2006-01-02T15-04-05"))) if err != nil { panic(err) } errlogger = log.New(io.MultiWriter(os.Stderr, logFile), "", log.LstdFlags) if fi, err := os.Stat(binpath); err == nil { errlogger.Println(fi.Name(), fi.ModTime()) } } stdlogger.Println(binname) errlogger.Println(binname) } func Println(v ...interface{}) { stdlogger.Output(2, fmt.Sprintln(v...)) } func Printf(format string, v ...interface{}) { stdlogger.Output(2, fmt.Sprintf(format, v...)) } func Error(v ...interface{}) { errlogger.Output(2, fmt.Sprintln(v...)) errlogger.Output(2, string(debug.Stack())) } func Errorf(format string, v ...interface{}) { errlogger.Output(2, fmt.Sprintf(format, v...)) errlogger.Output(2, string(debug.Stack())) } func Fatal(v ...interface{}) { errlogger.Output(2, fmt.Sprint(v...)) errlogger.Output(2, string(debug.Stack())) os.Exit(1) } func Fatalln(v ...interface{}) { errlogger.Output(2, fmt.Sprintln(v...)) errlogger.Output(2, string(debug.Stack())) os.Exit(1) } func Panic(v ...interface{}) { s := fmt.Sprint(v...) errlogger.Output(2, s) errlogger.Output(2, string(debug.Stack())) panic(s) } func Panicf(format string, v ...interface{}) { s := fmt.Sprintf(format, v...) errlogger.Output(2, s) errlogger.Output(2, string(debug.Stack())) panic(s) } func Panicln(v ...interface{}) { s := fmt.Sprintln(v...) errlogger.Output(2, s) errlogger.Output(2, string(debug.Stack())) panic(s) }