mirror/merlin/common/logger.go

86 lines
1.6 KiB
Go

package common
import (
"log"
"os"
)
type Logger struct {
*log.Logger
name string
file string
}
// DEBUG/WARNING will only be written to file
// INFO/ERROR will be written to file and printed to stdout/stderr
const (
DEBUG = iota
INFO
WARNING
ERROR
)
var levels = map[int]string{
DEBUG: "[DEBUG]",
INFO: "[INFO]",
WARNING: "[WARNING]",
ERROR: "[ERROR]",
}
var outLogger = log.New(os.Stdout, "", log.LstdFlags)
var errLogger = log.New(os.Stderr, "", log.LstdFlags)
func OutLogger() *log.Logger {
return outLogger
}
func ErrLogger() *log.Logger {
return errLogger
}
func NewLogger(name, file string) *Logger {
logger := Logger{
Logger: log.New(os.Stderr, "", log.LstdFlags),
name: name,
file: file,
}
return &logger
}
func (logger *Logger) Log(level int, v ...interface{}) {
if level == INFO {
outLogger.Println(append([]interface{}{"[" + logger.name + "]"}, v...))
} else if level == ERROR {
errLogger.Println(append([]interface{}{"[" + logger.name + "]"}, v...))
}
f, err := os.OpenFile(logger.file, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
errLogger.Println(err.Error())
}
defer f.Close()
levelStr := levels[level]
args := []interface{}{levelStr + ":"}
args = append(args, v...)
logger.SetOutput(f)
logger.Println(v...)
}
func (logger *Logger) Debug(v ...interface{}) {
logger.Log(DEBUG, v...)
}
func (logger *Logger) Info(v ...interface{}) {
logger.Log(INFO, v...)
}
func (logger *Logger) Warning(v ...interface{}) {
logger.Log(WARNING, v...)
}
func (logger *Logger) Error(v ...interface{}) {
logger.Log(ERROR, v...)
}