summary history files

desktop/backend/logwrap/logwrap.go
package logwrap

import (
	"fmt"
	"io"
	"log"
	"path/filepath"
	"runtime"
	"sync"
)

const (
	DEBUG   = 0
	INFO    = 10
	WARNING = 20
	ERROR   = 30
	NONE    = 100
)

var (
	pkgLock sync.Mutex
	allLogs = make(map[string]*LogWrap)
)

type LogWrap struct {
	name         string
	level        int
	errorLogWrap *log.Logger
	debugLogWrap *log.Logger
	infoLogWrap  *log.Logger
	logfileinfo  bool
	lock         sync.Mutex
}

func New(name string, dest io.Writer, logfileinfo bool, flags ...int) *LogWrap {
	pkgLock.Lock()
	defer pkgLock.Unlock()
	if _, exists := allLogs[name]; exists {
		panic(fmt.Sprintf("Unable to create logger with %s: name already in use", name))
	}

	var logFlags int
	if flags == nil {
		logFlags = log.Ldate | log.Ltime | log.Lmsgprefix
	} else {
		logFlags = flags[0]
	}

	logger := &LogWrap{
		name:         name,
		logfileinfo:  logfileinfo,
		errorLogWrap: log.New(dest, "ERROR: ", logFlags),
		debugLogWrap: log.New(dest, "DEBUG: ", logFlags),
		infoLogWrap:  log.New(dest, "INFO: ", logFlags),
	}

	allLogs[name] = logger
	return logger
}

func getfileinfo() string {
	_, filename, line, ok := runtime.Caller(2)
	if !ok {
		filename = "Unknown"
		line = 0
	}
	return fmt.Sprintf("%s:%d: ", filepath.Base(filename), line)
}

func (l *LogWrap) SetLevel(level int) {
	l.lock.Lock()
	defer l.lock.Unlock()
	l.level = level
}

func (l *LogWrap) Info(msg string) {
	l.lock.Lock()
	defer l.lock.Unlock()
	if l.level > INFO {
		return
	}
	if l.logfileinfo {
		msg = getfileinfo() + msg
	}
	l.infoLogWrap.Println(msg)
}

func (l *LogWrap) Error(msg string) {
	l.lock.Lock()
	defer l.lock.Unlock()
	if l.level > ERROR {
		return
	}
	if l.logfileinfo {
		msg = getfileinfo() + msg
	}
	l.errorLogWrap.Println(msg)
}

func (l *LogWrap) Debug(msg string) {
	l.lock.Lock()
	defer l.lock.Unlock()
	if l.level > DEBUG {
		return
	}
	if l.logfileinfo {
		msg = getfileinfo() + msg
	}
	l.debugLogWrap.Println(msg)
}

func Get(name string) *LogWrap {
	pkgLock.Lock()
	defer pkgLock.Unlock()
	if foundLog, ok := allLogs[name]; ok {
		return foundLog
	}
	return nil
}