110 lines
2.2 KiB
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)
|
|
}
|