improve verbose logger

This commit is contained in:
olebeck 2023-03-11 19:50:13 +01:00
parent 049a9a6d48
commit a163c6757c
2 changed files with 59 additions and 32 deletions

View File

@ -54,46 +54,70 @@ var (
dmpLock sync.Mutex
)
func dmpStruct(level int, in any, wType bool) (s string) {
func dmpStruct(level int, inputStruct any, withType bool, isInList bool) (s string) {
tBase := strings.Repeat("\t", level)
ii := reflect.Indirect(reflect.ValueOf(in))
if wType {
typeName := reflect.TypeOf(in).String()
s += typeName + " "
} else {
s += "\t"
ii := reflect.Indirect(reflect.ValueOf(inputStruct))
typeName := reflect.TypeOf(inputStruct).String()
typeString := ""
if withType {
if slices.Contains([]string{"bool", "string"}, typeName) {
} else {
typeString = typeName + " "
}
}
if ii.Kind() == reflect.Struct {
s += "{\n"
for i := 0; i < ii.NumField(); i++ {
field := ii.Type().Field(i)
if field.IsExported() {
d := dmpStruct(level+1, ii.Field(i).Interface(), true)
s += tBase + fmt.Sprintf("\t%s = %s\n", field.Name, d)
} else {
s += tBase + "\t" + field.Name + " (unexported)"
if ii.NumField() == 0 {
s += typeName + "{}"
} else {
s += typeName + "{\n"
for i := 0; i < ii.NumField(); i++ {
fieldType := ii.Type().Field(i)
if fieldType.IsExported() {
field := ii.Field(i).Interface()
d := dmpStruct(level+1, field, true, false)
s += tBase + fmt.Sprintf("\t%s = %s\n", fieldType.Name, d)
} else {
s += tBase + " " + fieldType.Name + " (unexported)"
}
}
s += tBase + "}"
}
s += tBase + "}\n"
} else if ii.Kind() == reflect.Slice {
var t reflect.Type
is_elem_struct := false
if ii.Len() > 0 {
e := ii.Index(0)
t = reflect.TypeOf(e.Interface())
is_elem_struct = t.Kind() == reflect.Struct
}
if ii.Len() > 1000 {
s += " [<slice too long>]"
} else if ii.Len() == 0 || t.Kind() == reflect.Struct {
s += "\t[\n"
for i := 0; i < ii.Len(); i++ {
s += tBase
s += dmpStruct(level+1, ii.Index(i).Interface(), false)
}
s += tBase + "]\n"
s += "[<slice too long>]"
} else if ii.Len() == 0 {
s += typeString + "[]"
} else {
s += fmt.Sprintf("%#v", ii.Interface())
s += typeString + "["
if is_elem_struct {
s += "\n"
}
for i := 0; i < ii.Len(); i++ {
if is_elem_struct {
s += tBase + "\t"
}
s += dmpStruct(level+1, ii.Index(i).Interface(), false, true)
if is_elem_struct {
s += "\n"
} else {
s += " "
}
}
if is_elem_struct {
s += tBase
}
s += "]"
}
} else if ii.Kind() == reflect.Map {
j, err := json.MarshalIndent(ii.Interface(), tBase, "\t")
@ -102,7 +126,10 @@ func dmpStruct(level int, in any, wType bool) (s string) {
}
s += string(j)
} else {
s += fmt.Sprintf(" %#v", ii.Interface())
if !isInList {
s += typeString
}
s += fmt.Sprintf("%#v", ii.Interface())
}
return s
@ -131,8 +158,8 @@ func PacketLogger(header packet.Header, payload []byte, src, dst net.Addr) {
if FLog != nil {
dmpLock.Lock()
defer dmpLock.Unlock()
FLog.Write([]byte(dmpStruct(0, pk, true)))
FLog.Write([]byte("\n\n"))
FLog.Write([]byte(dmpStruct(0, pk, true, false)))
FLog.Write([]byte("\n\n\n"))
}
pkName := reflect.TypeOf(pk).String()[1:]

View File

@ -2,14 +2,14 @@ package utils
import (
"archive/zip"
"fmt"
"io"
"io/fs"
"log"
"os"
"path"
"path/filepath"
"strings"
"github.com/sirupsen/logrus"
)
func UnpackZip(r io.ReaderAt, size int64, unpackFolder string) {
@ -31,7 +31,7 @@ func UnpackZip(r io.ReaderAt, size int64, unpackFolder string) {
func ZipFolder(filename, folder string) error {
f, err := os.Create(filename)
if err != nil {
log.Fatal(err)
logrus.Fatal(err)
}
zw := zip.NewWriter(f)
err = filepath.WalkDir(folder, func(path string, d fs.DirEntry, err error) error {
@ -40,7 +40,7 @@ func ZipFolder(filename, folder string) error {
zwf, _ := zw.Create(rel)
data, err := os.ReadFile(path)
if err != nil {
fmt.Println(err)
logrus.Error(err)
}
zwf.Write(data)
}