luet/pkg/logger/logger.go

330 lines
6.3 KiB
Go
Raw Normal View History

package logger
import (
"fmt"
2019-11-03 09:50:23 +00:00
"os"
"path"
"regexp"
"runtime"
2020-11-22 19:16:04 +00:00
"strings"
"sync"
2019-12-27 19:12:08 +00:00
. "github.com/mudler/luet/pkg/config"
2019-11-16 13:16:44 +00:00
"github.com/kyokomi/emoji"
. "github.com/logrusorgru/aurora"
"github.com/pterm/pterm"
2020-01-03 14:22:55 +00:00
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var s *pterm.SpinnerPrinter
2020-01-03 14:22:55 +00:00
var z *zap.Logger = nil
var aurora Aurora = nil
var spinnerLock = sync.Mutex{}
func NewSpinner() {
if s == nil {
s = pterm.DefaultSpinner.WithShowTimer(false).WithRemoveWhenDone(true)
}
}
func InitAurora() {
if aurora == nil {
aurora = NewAurora(LuetCfg.GetLogging().Color)
}
}
func GetAurora() Aurora {
return aurora
}
func NoColor() {
pterm.DisableColor()
}
2020-11-22 19:16:04 +00:00
func Ask() bool {
var input string
Info("Do you want to continue with this operation? [y/N]: ")
_, err := fmt.Scanln(&input)
if err != nil {
return false
2020-11-22 19:16:04 +00:00
}
input = strings.ToLower(input)
if input == "y" || input == "yes" {
return true
}
return false
}
2020-01-03 14:22:55 +00:00
func ZapLogger() error {
var err error
if z == nil {
// TODO: test permission for open logfile.
cfg := zap.NewProductionConfig()
cfg.OutputPaths = []string{LuetCfg.GetLogging().Path}
cfg.Level = level2AtomicLevel(LuetCfg.GetLogging().Level)
cfg.ErrorOutputPaths = []string{}
if LuetCfg.GetLogging().JsonFormat {
cfg.Encoding = "json"
} else {
cfg.Encoding = "console"
}
cfg.DisableCaller = true
cfg.DisableStacktrace = true
cfg.EncoderConfig.TimeKey = "time"
cfg.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
z, err = cfg.Build()
if err != nil {
fmt.Fprint(os.Stderr, "Error on initialize file logger: "+err.Error()+"\n")
return err
}
}
return nil
}
func Spinner(i int) {
spinnerLock.Lock()
defer spinnerLock.Unlock()
var confLevel int
if LuetCfg.GetGeneral().Debug {
confLevel = 3
} else {
confLevel = level2Number(LuetCfg.GetLogging().Level)
}
if 2 > confLevel {
return
}
if i > 43 {
i = 43
}
if s != nil && !s.IsActive {
// s.UpdateCharSet(spinner.CharSets[i])
//s.Start() // Start the spinner
// time.Sleep(second)
// for i := 14; i > 0; i-- {
// if i > 1 {
// introSpinner.UpdateText("Waiting for " + strconv.Itoa(i) + " seconds...")
// } else {
// introSpinner.UpdateText("Waiting for " + strconv.Itoa(i) + " second...")
// }
// time.Sleep(second)
// }
// s = introSpinner
s, _ = s.Start()
//introSpinner.Stop()
}
}
func Screen(text string) {
pterm.DefaultHeader.WithBackgroundStyle(pterm.NewStyle(pterm.BgLightBlue)).WithMargin(2).Println(text)
//pterm.DefaultCenter.Print(pterm.DefaultHeader.WithFullWidth().WithBackgroundStyle(pterm.NewStyle(pterm.BgLightBlue)).WithMargin(10).Sprint(text))
}
func SpinnerText(suffix, prefix string) {
2020-06-27 14:45:42 +00:00
if s != nil {
spinnerLock.Lock()
defer spinnerLock.Unlock()
2020-06-27 14:45:42 +00:00
if LuetCfg.GetGeneral().Debug {
fmt.Println(fmt.Sprintf("%s %s",
Bold(Cyan(prefix)).String(),
Bold(Magenta(suffix)).BgBlack().String(),
))
} else {
s.UpdateText(suffix + prefix)
2020-06-27 14:45:42 +00:00
}
}
}
func SpinnerStop() {
spinnerLock.Lock()
defer spinnerLock.Unlock()
var confLevel int
if LuetCfg.GetGeneral().Debug {
confLevel = 3
} else {
confLevel = level2Number(LuetCfg.GetLogging().Level)
}
if 2 > confLevel {
return
}
2020-06-27 14:45:42 +00:00
if s != nil {
s.Success()
2020-06-27 14:45:42 +00:00
}
}
func level2Number(level string) int {
switch level {
case "error":
return 0
case "warning":
return 1
case "info":
return 2
case "success":
return 3
default:
return 4
}
}
2020-01-03 14:22:55 +00:00
func log2File(level, msg string) {
switch level {
case "error":
z.Error(msg)
case "warning":
z.Warn(msg)
case "info", "success":
2020-01-03 14:22:55 +00:00
z.Info(msg)
default:
z.Debug(msg)
}
}
func level2AtomicLevel(level string) zap.AtomicLevel {
switch level {
case "error":
return zap.NewAtomicLevelAt(zap.ErrorLevel)
case "warning":
return zap.NewAtomicLevelAt(zap.WarnLevel)
case "info", "success":
2020-01-03 14:22:55 +00:00
return zap.NewAtomicLevelAt(zap.InfoLevel)
default:
return zap.NewAtomicLevelAt(zap.DebugLevel)
}
}
func init() {
InitAurora()
}
2021-02-01 18:10:05 +00:00
func Msg(level string, withoutColor, ln bool, msg ...interface{}) {
2019-11-13 16:07:59 +00:00
var message string
var confLevel, msgLevel int
if LuetCfg.GetGeneral().Debug {
confLevel = 3
} else {
confLevel = level2Number(LuetCfg.GetLogging().Level)
}
msgLevel = level2Number(level)
if msgLevel > confLevel {
return
}
2019-11-13 16:07:59 +00:00
for _, m := range msg {
message += " " + fmt.Sprintf("%v", m)
}
2019-11-03 09:50:23 +00:00
var levelMsg string
if withoutColor || !LuetCfg.GetLogging().Color {
levelMsg = message
} else {
switch level {
case "warning":
2021-01-22 10:54:00 +00:00
levelMsg = Yellow(":construction: warning" + message).BgBlack().String()
case "debug":
levelMsg = White(message).BgBlack().String()
case "info", "success":
2020-11-22 19:16:04 +00:00
levelMsg = message
case "error":
levelMsg = Red(message).String()
}
}
2019-11-03 09:50:23 +00:00
if LuetCfg.GetLogging().EnableEmoji {
levelMsg = emoji.Sprint(levelMsg)
} else {
re := regexp.MustCompile(`[:][\w]+[:]`)
levelMsg = re.ReplaceAllString(levelMsg, "")
}
2019-11-16 13:16:44 +00:00
2020-01-03 14:22:55 +00:00
if z != nil {
log2File(level, message)
}
2021-02-01 18:10:05 +00:00
if ln {
switch level {
case "info":
pterm.Info.Println(levelMsg)
case "success":
pterm.Success.Println(levelMsg)
case "warning":
pterm.Warning.Println(levelMsg)
case "error":
pterm.Error.Println(levelMsg)
case "fatal":
pterm.Fatal.Println(levelMsg)
default:
fmt.Println(levelMsg)
}
//
2021-02-01 18:10:05 +00:00
} else {
switch level {
case "success":
pterm.Success.Print(levelMsg)
case "info":
pterm.Info.Print(levelMsg)
case "warning":
pterm.Warning.Print(levelMsg)
case "error":
pterm.Error.Print(levelMsg)
case "fatal":
pterm.Fatal.Print(levelMsg)
default:
fmt.Print(levelMsg)
}
2021-02-01 18:10:05 +00:00
}
}
2019-11-03 09:50:23 +00:00
func Warning(mess ...interface{}) {
2021-02-01 18:10:05 +00:00
Msg("warning", false, true, mess...)
2020-01-03 14:41:45 +00:00
if LuetCfg.GetGeneral().FatalWarns {
os.Exit(2)
}
}
2019-11-03 09:50:23 +00:00
func Debug(mess ...interface{}) {
pc, file, line, ok := runtime.Caller(1)
if ok {
mess = append([]interface{}{fmt.Sprintf("DEBUG (%s:#%d:%v)",
path.Base(file), line, runtime.FuncForPC(pc).Name())}, mess...)
}
2021-02-01 18:10:05 +00:00
Msg("debug", false, true, mess...)
}
func DebugC(mess ...interface{}) {
2021-02-01 18:10:05 +00:00
Msg("debug", true, true, mess...)
2019-11-03 09:50:23 +00:00
}
func Info(mess ...interface{}) {
2021-02-01 18:10:05 +00:00
Msg("info", false, true, mess...)
}
func Success(mess ...interface{}) {
Msg("success", false, true, mess...)
}
func InfoC(mess ...interface{}) {
2021-02-01 18:10:05 +00:00
Msg("info", true, true, mess...)
2019-11-03 09:50:23 +00:00
}
func Error(mess ...interface{}) {
2021-02-01 18:10:05 +00:00
Msg("error", false, true, mess...)
2019-11-03 09:50:23 +00:00
}
func Fatal(mess ...interface{}) {
Error(mess...)
2019-11-03 09:50:23 +00:00
os.Exit(1)
}