mirror of
https://github.com/hrfee/jfa-go.git
synced 2024-11-13 22:00:10 +00:00
Harvey Tindall
fbe3553b25
Sometimes calls to app.err.Fatalf would fail to print the error to the console, and fail to show "A crash report has been saves to...". Both of these should be fixed now.
132 lines
2.5 KiB
Go
132 lines
2.5 KiB
Go
// Package logger provides a wrapper around log that adds color support with github.com/fatih/color.
|
|
package logger
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"log"
|
|
"runtime"
|
|
"strconv"
|
|
|
|
c "github.com/fatih/color"
|
|
)
|
|
|
|
// type Logger interface {
|
|
// Printf(format string, v ...interface{})
|
|
// Print(v ...interface{})
|
|
// Println(v ...interface{})
|
|
// Fatal(v ...interface{})
|
|
// Fatalf(format string, v ...interface{})
|
|
// SetFatalFunc(f func(err interface{}))
|
|
// }
|
|
|
|
type Logger struct {
|
|
empty bool
|
|
logger *log.Logger
|
|
shortfile bool
|
|
printer *c.Color
|
|
fatalFunc func(err interface{})
|
|
}
|
|
|
|
func Lshortfile() string {
|
|
// 0 = This function, 1 = Print/Printf/Println, 2 = Caller of Print/Printf/Println
|
|
_, file, line, ok := runtime.Caller(2)
|
|
lineString := strconv.Itoa(line)
|
|
if !ok {
|
|
return ""
|
|
}
|
|
if file == "" {
|
|
return lineString
|
|
}
|
|
for i := len(file) - 1; i > 0; i-- {
|
|
if file[i] == '/' || file[i] == '\\' {
|
|
file = file[i+1:]
|
|
break
|
|
}
|
|
}
|
|
return file + ":" + lineString + ":"
|
|
}
|
|
|
|
func NewLogger(out io.Writer, prefix string, flag int, color c.Attribute) (l *Logger) {
|
|
l = &Logger{}
|
|
// Use reimplemented Lshortfile since wrapping the log functions messes them up
|
|
if flag&log.Lshortfile != 0 {
|
|
flag -= log.Lshortfile
|
|
l.shortfile = true
|
|
}
|
|
|
|
l.logger = log.New(out, prefix, flag)
|
|
l.printer = c.New(color)
|
|
return l
|
|
}
|
|
|
|
func NewEmptyLogger() (l *Logger) { l.empty = true; return }
|
|
|
|
func (l *Logger) Printf(format string, v ...interface{}) {
|
|
if l.empty {
|
|
return
|
|
}
|
|
var out string
|
|
if l.shortfile {
|
|
out = Lshortfile()
|
|
}
|
|
out += " " + l.printer.Sprintf(format, v...)
|
|
l.logger.Print(out)
|
|
}
|
|
|
|
func (l *Logger) Print(v ...interface{}) {
|
|
if l.empty {
|
|
return
|
|
}
|
|
var out string
|
|
if l.shortfile {
|
|
out = Lshortfile()
|
|
}
|
|
out += " " + l.printer.Sprint(v...)
|
|
l.logger.Print(out)
|
|
}
|
|
|
|
func (l *Logger) Println(v ...interface{}) {
|
|
if l.empty {
|
|
return
|
|
}
|
|
var out string
|
|
if l.shortfile {
|
|
out = Lshortfile()
|
|
}
|
|
out += " " + l.printer.Sprintln(v...)
|
|
l.logger.Print(out)
|
|
}
|
|
|
|
func (l *Logger) Fatal(v ...interface{}) {
|
|
if l.empty {
|
|
return
|
|
}
|
|
var out string
|
|
if l.shortfile {
|
|
out = Lshortfile()
|
|
}
|
|
out += " " + l.printer.Sprint(v...)
|
|
l.logger.Fatal(out)
|
|
}
|
|
|
|
func (l *Logger) Fatalf(format string, v ...interface{}) {
|
|
if l.empty {
|
|
return
|
|
}
|
|
var out string
|
|
if l.shortfile {
|
|
out = Lshortfile()
|
|
}
|
|
out += " " + l.printer.Sprintf(format, v...)
|
|
if l.fatalFunc != nil {
|
|
l.fatalFunc(errors.New(out))
|
|
} else {
|
|
l.logger.Fatal(out)
|
|
}
|
|
}
|
|
|
|
func (l *Logger) SetFatalFunc(f func(err interface{})) {
|
|
l.fatalFunc = f
|
|
}
|