dockerfiles/anylink/server/base/log.go

166 lines
2.6 KiB
Go

package base
import (
"fmt"
"log"
"os"
"path"
"strings"
"time"
)
const (
LogLevelTrace = iota
LogLevelDebug
LogLevelInfo
LogLevelWarn
LogLevelError
LogLevelFatal
)
var (
baseLw *logWriter
baseLog *log.Logger
baseLevel int
levels map[int]string
dateFormat = "2006-01-02"
logName = "anylink.log"
)
// 实现 os.Writer 接口
type logWriter struct {
UseStdout bool
FileName string
File *os.File
NowDate string
}
// 实现日志文件的切割
func (lw *logWriter) Write(p []byte) (n int, err error) {
if !lw.UseStdout {
return lw.File.Write(p)
}
date := time.Now().Format(dateFormat)
if lw.NowDate != date {
_ = lw.File.Close()
_ = os.Rename(lw.FileName, lw.FileName+"."+lw.NowDate)
lw.NowDate = date
lw.newFile()
}
return lw.File.Write(p)
}
// 创建新文件
func (lw *logWriter) newFile() {
if lw.UseStdout {
lw.File = os.Stdout
return
}
f, err := os.OpenFile(lw.FileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
panic(err)
}
lw.File = f
}
func initLog() {
// 初始化 baseLog
baseLw = &logWriter{
UseStdout: Cfg.LogPath == "",
FileName: path.Join(Cfg.LogPath, logName),
NowDate: time.Now().Format(dateFormat),
}
baseLw.newFile()
baseLevel = logLevel2Int(Cfg.LogLevel)
baseLog = log.New(baseLw, "", log.LstdFlags|log.Lshortfile)
}
func GetBaseLw() *logWriter {
return baseLw
}
// 获取 log.Logger
func GetBaseLog() *log.Logger {
return baseLog
}
func GetLogLevel() int {
return baseLevel
}
func logLevel2Int(l string) int {
levels = map[int]string{
LogLevelTrace: "Trace",
LogLevelDebug: "Debug",
LogLevelInfo: "Info",
LogLevelWarn: "Warn",
LogLevelError: "Error",
LogLevelFatal: "Fatal",
}
lvl := LogLevelInfo
for k, v := range levels {
if strings.EqualFold(strings.ToLower(l), strings.ToLower(v)) {
lvl = k
}
}
return lvl
}
func output(l int, s ...interface{}) {
lvl := fmt.Sprintf("[%s] ", levels[l])
_ = baseLog.Output(3, lvl+fmt.Sprintln(s...))
}
func Trace(v ...interface{}) {
l := LogLevelTrace
if baseLevel > l {
return
}
output(l, v...)
}
func Debug(v ...interface{}) {
l := LogLevelDebug
if baseLevel > l {
return
}
output(l, v...)
}
func Info(v ...interface{}) {
l := LogLevelInfo
if baseLevel > l {
return
}
output(l, v...)
}
func Warn(v ...interface{}) {
l := LogLevelWarn
if baseLevel > l {
return
}
output(l, v...)
}
func Error(v ...interface{}) {
l := LogLevelError
if baseLevel > l {
return
}
output(l, v...)
}
func Fatal(v ...interface{}) {
l := LogLevelFatal
if baseLevel > l {
return
}
output(l, v...)
os.Exit(1)
}