wip: log
This commit is contained in:
parent
5050a4fdba
commit
277e8feba1
121
log/log.go
121
log/log.go
@ -1,10 +1,12 @@
|
|||||||
package log
|
package log
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/rs/zerolog"
|
"github.com/rs/zerolog"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Level zerolog.Level
|
type Level zerolog.Level
|
||||||
@ -48,9 +50,13 @@ var (
|
|||||||
onLogWriterError zerolog.Logger
|
onLogWriterError zerolog.Logger
|
||||||
writer *Writer
|
writer *Writer
|
||||||
DefaultOutlet io.Writer
|
DefaultOutlet io.Writer
|
||||||
|
errType reflect.Type
|
||||||
|
invalidTypeError error = errors.New("invalid type")
|
||||||
|
noValidFieldError error = errors.New("no valid field")
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
errType = reflect.TypeOf((*error)(nil)).Elem()
|
||||||
DefaultOutlet = os.Stderr
|
DefaultOutlet = os.Stderr
|
||||||
writer = NewWriter()
|
writer = NewWriter()
|
||||||
logger = zerolog.New(writer)
|
logger = zerolog.New(writer)
|
||||||
@ -79,6 +85,8 @@ func (p *Payload) Fields(a ...any) *Payload {
|
|||||||
var (
|
var (
|
||||||
event *zerolog.Event
|
event *zerolog.Event
|
||||||
key string
|
key string
|
||||||
|
val reflect.Value
|
||||||
|
typ reflect.Type
|
||||||
)
|
)
|
||||||
|
|
||||||
event = (*zerolog.Event)(p)
|
event = (*zerolog.Event)(p)
|
||||||
@ -86,16 +94,32 @@ func (p *Payload) Fields(a ...any) *Payload {
|
|||||||
if i%2 == 0 {
|
if i%2 == 0 {
|
||||||
key = part.(string)
|
key = part.(string)
|
||||||
} else {
|
} else {
|
||||||
switch v := part.(type) {
|
val = reflect.ValueOf(part)
|
||||||
case string:
|
typ = val.Type()
|
||||||
event = event.Str(key, v)
|
switch typ.Kind() {
|
||||||
case error:
|
case reflect.String:
|
||||||
event = event.Err(v)
|
event = event.Str(key, val.String())
|
||||||
|
case reflect.Slice:
|
||||||
|
case reflect.Pointer:
|
||||||
|
|
||||||
default:
|
default:
|
||||||
event = event.Str(key, fmt.Sprintf("[no data type handle] %v", v))
|
if typ.Implements(errType) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
event = payload(event).unhandledField(key, part)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//switch v := part.(type) {
|
||||||
|
//case string:
|
||||||
|
// event = event.Str(key, v)
|
||||||
|
//case error:
|
||||||
|
// event = event.Err(v)
|
||||||
|
//
|
||||||
|
//default:
|
||||||
|
// event = event.Str(key, fmt.Sprintf("[no data type handle] %v", v))
|
||||||
|
//}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return (*Payload)(event)
|
return (*Payload)(event)
|
||||||
}
|
}
|
||||||
@ -114,6 +138,91 @@ func (p *Payload) Send(ws ...io.Writer) {
|
|||||||
event.Send()
|
event.Send()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Payload) unhandledField(key string, v any) *zerolog.Event {
|
||||||
|
var (
|
||||||
|
event *zerolog.Event
|
||||||
|
)
|
||||||
|
|
||||||
|
event = (*zerolog.Event)(p)
|
||||||
|
return event.Str(key, fmt.Sprintf("[unhandled data type / invalid] %+v", v))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Payload) slice(val reflect.Value) (*zerolog.Array, error) {
|
||||||
|
var (
|
||||||
|
vlen int
|
||||||
|
outlen int
|
||||||
|
i int
|
||||||
|
rval *zerolog.Array
|
||||||
|
event *zerolog.Event
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
vlen = val.Len()
|
||||||
|
rval = zerolog.Arr()
|
||||||
|
for i = 0; i < vlen; i++ {
|
||||||
|
switch val.Index(i).Kind() {
|
||||||
|
//TODO: handle more cases
|
||||||
|
case reflect.String:
|
||||||
|
outlen++
|
||||||
|
rval.Str(val.String())
|
||||||
|
case reflect.Struct:
|
||||||
|
event, err = p.structType(val)
|
||||||
|
if err == nil {
|
||||||
|
rval.Dict(event)
|
||||||
|
outlen++
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
rval.Str(fmt.Sprintf("[unhandled data type / invalid] %+v", val.Interface()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, nil //TODO: placeholder, FIX ME!
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Payload) pointer(val reflect.Value) (*Payload, error) {
|
||||||
|
val = val.Elem()
|
||||||
|
if val.Kind() != reflect.Struct {
|
||||||
|
return nil, invalidTypeError
|
||||||
|
}
|
||||||
|
|
||||||
|
event, err := p.structType(val)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return payload(event), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Payload) structType(val reflect.Value) (*zerolog.Event, error) {
|
||||||
|
var (
|
||||||
|
typ reflect.Type
|
||||||
|
event *zerolog.Event
|
||||||
|
)
|
||||||
|
|
||||||
|
typ = val.Type()
|
||||||
|
for _, sf := range reflect.VisibleFields(typ) {
|
||||||
|
if sf.Type.Kind() == reflect.String {
|
||||||
|
if event == nil {
|
||||||
|
event = zerolog.Dict()
|
||||||
|
}
|
||||||
|
event.Str(sf.Name, val.FieldByIndex(sf.Index).String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if event == nil {
|
||||||
|
return nil, noValidFieldError
|
||||||
|
}
|
||||||
|
|
||||||
|
return event, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Payload) event() *zerolog.Event {
|
||||||
|
return (*zerolog.Event)(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
func payload(event *zerolog.Event) *Payload {
|
||||||
|
return (*Payload)(event)
|
||||||
|
}
|
||||||
|
|
||||||
func Print(a ...any) {
|
func Print(a ...any) {
|
||||||
globalLevel.Print(a...)
|
globalLevel.Print(a...)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user