package main import ( "fmt" "log" "os" ) // LogLevel 定义日志级别 type LogLevel int // 日志级别常量 const ( LogLevelInfo LogLevel = iota LogLevelWarn LogLevelError LogLevelDebug ) // Logger 日志管理器 type Logger struct { file *os.File infoLog *log.Logger warnLog *log.Logger errorLog *log.Logger debugLog *log.Logger level LogLevel } // NewLogger 创建新的日志管理器 func NewLogger() *Logger { // 打开或创建日志文件,追加模式 file, err := os.OpenFile("firewall.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { log.Printf("Failed to open log file, using stdout: %v", err) file = os.Stdout } // 创建不同级别的日志记录器 infoLog := log.New(file, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile) warnLog := log.New(file, "WARN: ", log.Ldate|log.Ltime|log.Lshortfile) errorLog := log.New(file, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile) debugLog := log.New(file, "DEBUG: ", log.Ldate|log.Ltime|log.Lshortfile) return &Logger{ file: file, infoLog: infoLog, warnLog: warnLog, errorLog: errorLog, debugLog: debugLog, level: LogLevelInfo, // 默认日志级别为INFO } } // SetLevel 设置日志级别 func (l *Logger) SetLevel(level LogLevel) { l.level = level } // Info 记录INFO级别日志 func (l *Logger) Info(v ...interface{}) { if l.level <= LogLevelInfo { l.infoLog.Println(v...) } } // Warn 记录WARN级别日志 func (l *Logger) Warn(v ...interface{}) { if l.level <= LogLevelWarn { l.warnLog.Println(v...) } } // Error 记录ERROR级别日志 func (l *Logger) Error(v ...interface{}) { if l.level <= LogLevelError { l.errorLog.Println(v...) } } // Debug 记录DEBUG级别日志 func (l *Logger) Debug(v ...interface{}) { if l.level <= LogLevelDebug { l.debugLog.Println(v...) } } // Close 关闭日志文件 func (l *Logger) Close() { if l.file != os.Stdout { l.file.Close() } } // LogPacket 记录数据包信息 func (l *Logger) LogPacket(rule *Rule, srcIP, dstIP string, srcPort, dstPort int, protocol Protocol, action RuleAction) { logMsg := fmt.Sprintf( "Packet matched rule %s: %s %s:%d -> %s:%d, action: %s", rule.ID, protocol, srcIP, srcPort, dstIP, dstPort, action, ) l.Info(logMsg) }