gofirewall/logger.go

110 lines
2.2 KiB
Go

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)
}