github.com/qlik-oss/gopherciser@v0.18.6/logger/jsonwriter.go (about) 1 package logger 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/rs/zerolog" 8 ) 9 10 type ( 11 // JSONWriter wrapper implementing MessageWriter for zerolog 12 JSONWriter struct { 13 writer *zerolog.Logger 14 } 15 ) 16 17 // NewJSONWriter wrapper implementing MessageWriter for zerolog 18 func NewJSONWriter(zlgr *zerolog.Logger) *JSONWriter { 19 return &JSONWriter{ 20 writer: zlgr, 21 } 22 } 23 24 // WriteMessage implement MsgWriter interface 25 func (jw *JSONWriter) WriteMessage(msg *LogChanMsg) error { 26 var event *zerolog.Event 27 switch msg.Level { 28 case ErrorLevel: 29 event = jw.writer.Error() 30 case WarningLevel: 31 event = jw.writer.Warn() 32 case DebugLevel: 33 event = jw.writer.Debug() 34 case UnknownLevel: 35 event = jw.writer.Info() 36 default: 37 event = jw.writer.Info() 38 } 39 40 setEntryFields(event, msg) 41 42 return nil 43 } 44 45 // Level implement MsgWriter interface 46 func (jw *JSONWriter) Level(lvl LogLevel) { 47 var zlgr zerolog.Logger 48 switch lvl { 49 case DebugLevel: 50 zlgr = jw.writer.Level(zerolog.DebugLevel) 51 case ErrorLevel: 52 zlgr = jw.writer.Level(zerolog.ErrorLevel) 53 default: 54 zlgr = jw.writer.Level(zerolog.InfoLevel) 55 } 56 jw.writer = &zlgr 57 } 58 59 func setEntryFields(ev *zerolog.Event, msg *LogChanMsg) { 60 if ev == nil || msg == nil { 61 return 62 } 63 64 setSessionFields(ev, &msg.SessionEntry) 65 setActionFields(ev, &msg.ActionEntry) 66 setEphemeralFields(ev, msg.ephemeralEntry, msg.Level) 67 setMessageFields(ev, &msg.message) 68 } 69 70 func setSessionFields(ev *zerolog.Event, s *SessionEntry) { 71 ev.Str(FieldAppName, s.AppName) 72 ev.Str(FieldAppGUID, s.AppGUID) 73 ev.Uint64(FieldSession, s.Session) 74 ev.Str(FieldSessionName, s.SessionName) 75 ev.Uint64(FieldThread, s.Thread) 76 ev.Str(FieldAuthUser, s.User) 77 } 78 79 func setActionFields(ev *zerolog.Event, a *ActionEntry) { 80 ev.Str(FieldAction, a.Action) 81 ev.Uint64(FieldActionID, a.ActionID) 82 ev.Str(FieldLabel, a.Label) 83 ev.Str(FieldObjectType, a.ObjectType) 84 } 85 86 func setEphemeralFields(ev *zerolog.Event, e *ephemeralEntry, level LogLevel) { 87 ev.Str(FieldDetails, e.Details) 88 ev.Uint64(FieldErrors, e.Errors) 89 ev.Str(FieldInfoType, e.InfoType) 90 ev.Uint64(FieldReceived, e.Received) 91 ev.Uint64(FieldRequestsSent, e.RequestsSent) 92 ev.Uint64(FieldSent, e.Sent) 93 errMsg := "" 94 if e.Stack != nil { 95 errMsg = fmt.Sprintf("%+v", e.Stack) 96 } 97 ev.Str(FieldStack, errMsg) 98 if level == ResultLevel { 99 ev.Bool(FieldSuccess, e.Success) 100 } 101 ev.Uint64(FieldWarnings, e.Warnings) 102 ev.Int64(FieldResponseTime, e.ResponseTime) 103 } 104 105 func setMessageFields(ev *zerolog.Event, m *message) { 106 ev.Str(FieldLevel, m.Level.String()) 107 ev.Uint64(FieldTick, m.Tick) 108 ev.Str(FieldTime, m.Time.Format(time.RFC3339Nano)) 109 ev.Str(FieldTimestamp, m.Time.UTC().Format(time.RFC3339Nano)) 110 ev.Msg(m.Message) 111 }