// logger.go package main import ( "fmt" "io" "log" "os" "path/filepath" "time" ) // 日志文件 var ( logFile *os.File Logger *log.Logger // 导出Logger供其他包使用 TCPDataLogger *log.Logger // 专门用于记录TCP数据的日志 ) // 初始化日志系统 func InitLogger() error { // 创建logs目录 logsDir := "logs" if err := os.MkdirAll(logsDir, 0755); err != nil { return fmt.Errorf("创建日志目录失败: %v", err) } // 创建当天的日志文件 today := time.Now().Format("2006-01-02") logFilePath := filepath.Join(logsDir, fmt.Sprintf("server_%s.log", today)) file, err := os.OpenFile(logFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { return fmt.Errorf("打开日志文件失败: %v", err) } logFile = file // 创建一个多输出的logger,同时写入文件和控制台 multiWriter := io.MultiWriter(os.Stdout, file) Logger = log.New(multiWriter, "", log.Ldate|log.Ltime|log.Lshortfile) // 创建TCP数据日志文件 tcpDataFilePath := filepath.Join(logsDir, fmt.Sprintf("tcp_data_%s.log", today)) tcpDataFile, err := os.OpenFile(tcpDataFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { return fmt.Errorf("打开TCP数据日志文件失败: %v", err) } // TCP数据日志同时写入文件和控制台 tcpDataMultiWriter := io.MultiWriter(os.Stdout, tcpDataFile) TCPDataLogger = log.New(tcpDataMultiWriter, "TCP_DATA: ", log.Ldate|log.Ltime) // 替换标准日志 log.SetOutput(multiWriter) log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) Logger.Println("日志系统初始化完成") return nil } // 关闭日志文件 func CloseLogger() { if logFile != nil { logFile.Close() } } // 日志轮转,每天创建新的日志文件 func StartLogRotation() { go func() { for { // 等待到明天0点 now := time.Now() next := now.Add(24 * time.Hour) next = time.Date(next.Year(), next.Month(), next.Day(), 0, 0, 0, 0, next.Location()) duration := next.Sub(now) time.Sleep(duration) // 重新初始化日志 Logger.Println("开始日志轮转...") CloseLogger() if err := InitLogger(); err != nil { log.Printf("日志轮转失败: %v", err) } } }() }