尝试写一个日志管理 以协议为控制粒度

This commit is contained in:
impact-eintr
2022-12-08 19:33:21 +08:00
parent 9a46ec9db5
commit 478d7cbc71
4 changed files with 63 additions and 4 deletions

View File

@@ -5,6 +5,7 @@ import (
"fmt"
"log"
"net"
"netstack/logger"
"netstack/tcpip"
"netstack/tcpip/link/fdbased"
"netstack/tcpip/link/tuntap"
@@ -140,6 +141,7 @@ func main() {
// conn.Close()
//}()
//logger.SetFlags(logger.TCP)
go func() { // echo server
listener := tcpListen(s, proto, addr, localPort)
conn, err := listener.Accept()
@@ -150,7 +152,9 @@ func main() {
if _, err := conn.Read(buf); err != nil {
log.Fatal(err)
}
fmt.Println(string(buf))
logger.GetInstance().Info(logger.TCP, func() {
fmt.Println(string(buf))
})
if string(buf) != "" {
conn.Write([]byte("Server echo"))
}

49
logger/logger.go Normal file
View File

@@ -0,0 +1,49 @@
package logger
import (
"sync"
)
const (
IP = 1 << iota
UDP
TCP
)
type logger struct {
flags uint8
}
var instance *logger
var once sync.Once
// GetInstance 获取日志实例
func GetInstance() *logger {
once.Do(func() {
instance = &logger{
//flags: 255,
}
})
return instance
}
// SetFlags 设置输出类型
func SetFlags(flags uint8) {
GetInstance().flags = flags
}
/*
logger.GetInstance(IP|TCP)
logger.GetInstance().Info(logger.IP, msg) // 会输出
logger.GetInstance().Info(logger.UDP, msg) // 不会输出
*/
func (l *logger) Info(mask uint8, f func()) {
if mask&l.flags != 0 {
f()
}
}

View File

@@ -2,6 +2,7 @@ package ipv4
import (
"log"
"netstack/logger"
"netstack/tcpip"
"netstack/tcpip/buffer"
"netstack/tcpip/header"
@@ -129,7 +130,9 @@ func (e *endpoint) HandlePacket(r *stack.Route, vv buffer.VectorisedView) {
if !h.IsValid(vv.Size()) {
return
}
log.Println(h)
logger.GetInstance().Info(logger.IP, func() {
log.Println(h)
})
hlen := int(h.HeaderLength())
tlen := int(h.TotalLength())

View File

@@ -3,6 +3,7 @@ package tcp
import (
"fmt"
"log"
"netstack/logger"
"netstack/tcpip/buffer"
"netstack/tcpip/header"
"netstack/tcpip/seqnum"
@@ -122,8 +123,10 @@ func (s *segment) parse() bool {
s.options = h.Options()
s.parsedOptions = header.ParseTCPOptions(s.options)
log.Println(h)
fmt.Println(s.parsedOptions)
logger.GetInstance().Info(logger.TCP, func() {
log.Println(h)
fmt.Println(s.parsedOptions)
})
s.data.TrimFront(offset)