This commit is contained in:
Suyono 2023-09-11 12:28:53 +10:00
parent 277e8feba1
commit d406fe698f
2 changed files with 98 additions and 51 deletions

View File

@ -37,8 +37,7 @@ func NewLogFile(configKey string) (*File, error) {
} }
func (f *File) Write(b []byte) (int, error) { func (f *File) Write(b []byte) (int, error) {
var file *os.File file := (*os.File)(f)
file = (*os.File)(f)
return file.Write(b) return file.Write(b)
} }

View File

@ -3,10 +3,11 @@ package log
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/rs/zerolog"
"io" "io"
"os" "os"
"reflect" "reflect"
"github.com/rs/zerolog"
) )
type Level zerolog.Level type Level zerolog.Level
@ -45,14 +46,14 @@ const (
) )
var ( var (
globalLevel Level = Error globalLevel Level = Error
logger zerolog.Logger logger zerolog.Logger
onLogWriterError zerolog.Logger onLogWriterError zerolog.Logger
writer *Writer writer *Writer
DefaultOutlet io.Writer DefaultOutlet io.Writer
errType reflect.Type errType reflect.Type
invalidTypeError error = errors.New("invalid type") errInvalidType error = errors.New("invalid type")
noValidFieldError error = errors.New("no valid field") errNoValidField error = errors.New("no valid field")
) )
func init() { func init() {
@ -84,9 +85,12 @@ func (p *Payload) HandleFields(a ...any) FieldsHandler {
func (p *Payload) Fields(a ...any) *Payload { func (p *Payload) Fields(a ...any) *Payload {
var ( var (
event *zerolog.Event event *zerolog.Event
sub *zerolog.Event
key string key string
val reflect.Value val reflect.Value
typ reflect.Type typ reflect.Type
arr *zerolog.Array
err error
) )
event = (*zerolog.Event)(p) event = (*zerolog.Event)(p)
@ -99,9 +103,50 @@ func (p *Payload) Fields(a ...any) *Payload {
switch typ.Kind() { switch typ.Kind() {
case reflect.String: case reflect.String:
event = event.Str(key, val.String()) event = event.Str(key, val.String())
case reflect.Slice: case reflect.Slice, reflect.Array:
if arr, err = p.slice(val); err != nil {
event = payload(event).unhandledField(key, part)
} else {
event = event.Array(key, arr)
}
case reflect.Bool:
event = event.Bool(key, val.Bool())
case reflect.Struct:
if sub, err = p.structType(val); err != nil {
event = payload(event).unhandledField(key, part)
} else {
event = event.Dict(key, sub)
}
case reflect.Pointer: case reflect.Pointer:
if sub, err = p.pointer(val); err != nil {
event = payload(event).unhandledField(key, part)
} else {
event = event.Dict(key, sub)
}
case reflect.Int:
event = event.Int(key, int(val.Int()))
case reflect.Int8:
event = event.Int8(key, int8(val.Int()))
case reflect.Int16:
event = event.Int16(key, int16(val.Int()))
case reflect.Int32:
event = event.Int32(key, int32(val.Int()))
case reflect.Int64:
event = event.Int64(key, val.Int())
case reflect.Float32:
event = event.Float32(key, float32(val.Float()))
case reflect.Float64:
event = event.Float64(key, val.Float())
case reflect.Uint:
event = event.Uint(key, uint(val.Uint()))
case reflect.Uint8:
event = event.Uint8(key, uint8(val.Uint()))
case reflect.Uint16:
event = event.Uint16(key, uint16(val.Uint()))
case reflect.Uint32:
event = event.Uint32(key, uint32(val.Uint()))
case reflect.Uint64:
event = event.Uint64(key, val.Uint())
default: default:
if typ.Implements(errType) { if typ.Implements(errType) {
@ -109,16 +154,6 @@ func (p *Payload) Fields(a ...any) *Payload {
event = payload(event).unhandledField(key, part) 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)
@ -139,22 +174,17 @@ func (p *Payload) Send(ws ...io.Writer) {
} }
func (p *Payload) unhandledField(key string, v any) *zerolog.Event { func (p *Payload) unhandledField(key string, v any) *zerolog.Event {
var ( event := (*zerolog.Event)(p)
event *zerolog.Event
)
event = (*zerolog.Event)(p)
return event.Str(key, fmt.Sprintf("[unhandled data type / invalid] %+v", v)) return event.Str(key, fmt.Sprintf("[unhandled data type / invalid] %+v", v))
} }
func (p *Payload) slice(val reflect.Value) (*zerolog.Array, error) { func (p *Payload) slice(val reflect.Value) (*zerolog.Array, error) {
var ( var (
vlen int vlen int
outlen int i int
i int rval *zerolog.Array
rval *zerolog.Array event *zerolog.Event
event *zerolog.Event err error
err error
) )
vlen = val.Len() vlen = val.Len()
@ -163,33 +193,51 @@ func (p *Payload) slice(val reflect.Value) (*zerolog.Array, error) {
switch val.Index(i).Kind() { switch val.Index(i).Kind() {
//TODO: handle more cases //TODO: handle more cases
case reflect.String: case reflect.String:
outlen++ rval = rval.Str(val.String())
rval.Str(val.String())
case reflect.Struct: case reflect.Struct:
event, err = p.structType(val) if event, err = p.structType(val); err != nil {
if err == nil { return nil, err
rval.Dict(event)
outlen++
} }
rval = rval.Dict(event)
case reflect.Int:
rval = rval.Int(int(val.Int()))
case reflect.Int8:
rval = rval.Int8(int8(val.Int()))
case reflect.Int16:
rval = rval.Int16(int16(val.Int()))
case reflect.Int32:
rval = rval.Int32(int32(val.Int()))
case reflect.Int64:
rval = rval.Int64(val.Int())
case reflect.Float32:
rval = rval.Float32(float32(val.Float()))
case reflect.Float64:
rval = rval.Float64(val.Float())
case reflect.Uint:
rval = rval.Uint(uint(val.Uint()))
case reflect.Uint8:
rval = rval.Uint8(uint8(val.Uint()))
case reflect.Uint16:
rval = rval.Uint16(uint16(val.Uint()))
case reflect.Uint32:
rval = rval.Uint32(uint32(val.Uint()))
case reflect.Uint64:
rval = rval.Uint64(val.Uint())
default: default:
rval.Str(fmt.Sprintf("[unhandled data type / invalid] %+v", val.Interface())) rval = rval.Str(fmt.Sprintf("[unhandled data type / invalid] %+v", val.Interface()))
} }
} }
return nil, nil //TODO: placeholder, FIX ME! return rval, nil
} }
func (p *Payload) pointer(val reflect.Value) (*Payload, error) { // pointer only supports pointer to a struct
func (p *Payload) pointer(val reflect.Value) (*zerolog.Event, error) {
val = val.Elem() val = val.Elem()
if val.Kind() != reflect.Struct { if val.Kind() != reflect.Struct {
return nil, invalidTypeError return nil, errInvalidType
} }
event, err := p.structType(val) return p.structType(val)
if err != nil {
return nil, err
}
return payload(event), nil
} }
func (p *Payload) structType(val reflect.Value) (*zerolog.Event, error) { func (p *Payload) structType(val reflect.Value) (*zerolog.Event, error) {
@ -209,7 +257,7 @@ func (p *Payload) structType(val reflect.Value) (*zerolog.Event, error) {
} }
if event == nil { if event == nil {
return nil, noValidFieldError return nil, errNoValidField
} }
return event, nil return event, nil