type LogSet struct { infoLogger *log.Logger warningLogger *log.Logger errorLogger *log.Logger logFile *os.File }
var eLogs *LogSet
func init() { eLogs = NewLogger("./logs") }
func NewLogger(logDir string) *LogSet { if err := os.MkdirAll(logDir, 0755); err != nil { log.Fatal("无法创建日志目录:", err) }
logFileName := filepath.Join(logDir, time.Now().Format("2006-01-02")+".log") file, err := os.OpenFile(logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { log.Fatal("无法创建日志文件:", err) } infoWriter := io.MultiWriter(os.Stdout, file) warningWriter := io.MultiWriter(os.Stdout, file) errorWriter := io.MultiWriter(os.Stderr, file)
return &LogSet{ infoLogger: log.New(infoWriter, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile), warningLogger: log.New(warningWriter, "WARNING: ", log.Ldate|log.Ltime|log.Lshortfile), errorLogger: log.New(errorWriter, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile), logFile: file, } }
func (l *LogSet) Close() { if l.logFile != nil { err := l.logFile.Close() if err != nil { return } } }
func (l *LogSet) Info(v ...interface{}) { l.infoLogger.Println(v...) } func (l *LogSet) Infof(format string, v ...interface{}) { l.infoLogger.Printf(format, v...) }
func (l *LogSet) Warning(v ...interface{}) { l.warningLogger.Println(v...) }
func (l *LogSet) Warningf(format string, v ...interface{}) { l.warningLogger.Printf(format, v...) }
func (l *LogSet) Error(v ...interface{}) { l.errorLogger.Println(v...) }
func (l *LogSet) Errorf(format string, v ...interface{}) { l.errorLogger.Printf(format, v...) }
func main() { if eLogs == nil { eLogs = NewLogger("./logs") } defer eLogs.Close()
eLogs.Infof("应用启动成功") eLogs.Warning("这是警告信息") eLogs.Error("这是错误信息") userID := 123 action := "删除"
eLogs.Error("用户ID:", userID, "操作:", action)
eLogs.Errorf("用户ID: %d, 操作: %s", userID, action)
eLogs.Error("连接失败", "重试次数", 3, "错误", "timeout")
eLogs.Errorf("连接失败,重试次数: %d, 错误: %s", 3, "timeout") }
|