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  }