func AssembleMsg()

in logging/logging.go [152:242]


func AssembleMsg(depth int, logLevel, msg string, err error, keysAndValues ...interface{}) string {
	sb := strings.Builder{}
	sb.Grow(defaultLogMsgBufferSize)

	file, line := caller(depth)
	timeStr := time.Now().Format("2006-01-02 15:04:05.520")
	caller := fmt.Sprintf("%s:%d", file, line)
	sb.WriteString("{")

	sb.WriteByte('"')
	sb.WriteString("timestamp")
	sb.WriteByte('"')
	sb.WriteByte(':')
	sb.WriteByte('"')
	sb.WriteString(timeStr)
	sb.WriteByte('"')
	sb.WriteByte(',')

	sb.WriteByte('"')
	sb.WriteString("caller")
	sb.WriteByte('"')
	sb.WriteByte(':')
	sb.WriteByte('"')
	sb.WriteString(caller)
	sb.WriteByte('"')
	sb.WriteByte(',')

	sb.WriteByte('"')
	sb.WriteString("logLevel")
	sb.WriteByte('"')
	sb.WriteByte(':')
	sb.WriteByte('"')
	sb.WriteString(logLevel)
	sb.WriteByte('"')
	sb.WriteByte(',')

	sb.WriteByte('"')
	sb.WriteString("msg")
	sb.WriteByte('"')
	sb.WriteByte(':')
	data := toSafeJSONString(msg)
	sb.Write(data)

	kvLen := len(keysAndValues)
	if kvLen&1 != 0 {
		sb.WriteByte(',')
		sb.WriteByte('"')
		sb.WriteString("kvs")
		sb.WriteByte('"')
		sb.WriteByte(':')
		s := fmt.Sprintf("%+v", keysAndValues)
		data := toSafeJSONString(s)
		sb.Write(data)
	} else if kvLen != 0 {
		for i := 0; i < kvLen; {
			k := keysAndValues[i]
			v := keysAndValues[i+1]
			kStr, kIsStr := k.(string)
			if !kIsStr {
				kStr = fmt.Sprintf("%+v", k)
			}
			sb.WriteByte(',')
			data := toSafeJSONString(kStr)
			sb.Write(data)
			sb.WriteByte(':')
			switch v.(type) {
			case string:
				data := toSafeJSONString(v.(string))
				sb.Write(data)
			case error:
				data := toSafeJSONString(v.(error).Error())
				sb.Write(data)
			default:
				if vbs, err := json.Marshal(v); err != nil {
					s := fmt.Sprintf("%+v", v)
					data := toSafeJSONString(s)
					sb.Write(data)
				} else {
					sb.Write(vbs)
				}
			}
			i = i + 2
		}
	}
	sb.WriteByte('}')
	if err != nil {
		sb.WriteString("\n")
		sb.WriteString(fmt.Sprintf("%+v", err))
	}
	return sb.String()
}