github.com/cloudfoundry-attic/ltc@v0.0.0-20151123212628-098adc7919fc/logs/console_tailed_logs_outputter/chug/chug_log_message.go (about)

     1  package chug
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"strconv"
     7  	"strings"
     8  	"time"
     9  
    10  	"github.com/cloudfoundry/sonde-go/events"
    11  	"github.com/pivotal-golang/lager"
    12  )
    13  
    14  type Entry struct {
    15  	IsLager    bool
    16  	LogMessage *events.LogMessage
    17  	Raw        []byte
    18  	Log        LogEntry
    19  }
    20  
    21  type LogEntry struct {
    22  	Timestamp time.Time
    23  	LogLevel  lager.LogLevel
    24  	Source    string
    25  	Message   string
    26  	Session   string
    27  	Error     error
    28  	Trace     string
    29  	Data      lager.Data
    30  }
    31  
    32  func ChugLogMessage(logMessage *events.LogMessage) Entry {
    33  	entry := Entry{
    34  		IsLager:    false,
    35  		LogMessage: logMessage,
    36  		Raw:        logMessage.GetMessage(),
    37  	}
    38  
    39  	rawString := string(entry.Raw)
    40  	idx := strings.Index(rawString, "{")
    41  	if idx == -1 {
    42  		return entry
    43  	}
    44  
    45  	var lagerLog lager.LogFormat
    46  	decoder := json.NewDecoder(strings.NewReader(rawString[idx:]))
    47  	err := decoder.Decode(&lagerLog)
    48  	if err != nil {
    49  		return entry
    50  	}
    51  
    52  	entry.Log, entry.IsLager = convertLagerLog(lagerLog)
    53  
    54  	return entry
    55  }
    56  
    57  func convertLagerLog(lagerLog lager.LogFormat) (LogEntry, bool) {
    58  	timestamp, err := strconv.ParseFloat(lagerLog.Timestamp, 64)
    59  	if err != nil {
    60  		return LogEntry{}, false
    61  	}
    62  
    63  	data := lagerLog.Data
    64  
    65  	var logErr error
    66  	if lagerLog.LogLevel == lager.ERROR || lagerLog.LogLevel == lager.FATAL {
    67  		dataErr, ok := lagerLog.Data["error"]
    68  		if ok {
    69  			errorString, ok := dataErr.(string)
    70  			if !ok {
    71  				return LogEntry{}, false
    72  			}
    73  			logErr = errors.New(errorString)
    74  			delete(lagerLog.Data, "error")
    75  		}
    76  	}
    77  
    78  	var logTrace string
    79  	dataTrace, ok := lagerLog.Data["trace"]
    80  	if ok {
    81  		logTrace, ok = dataTrace.(string)
    82  		if !ok {
    83  			return LogEntry{}, false
    84  		}
    85  		delete(lagerLog.Data, "trace")
    86  	}
    87  
    88  	var logSession string
    89  	dataSession, ok := lagerLog.Data["session"]
    90  	if ok {
    91  		logSession, ok = dataSession.(string)
    92  		if !ok {
    93  			return LogEntry{}, false
    94  		}
    95  		delete(lagerLog.Data, "session")
    96  	}
    97  
    98  	return LogEntry{
    99  		Timestamp: time.Unix(0, int64(timestamp*1e9)),
   100  		LogLevel:  lagerLog.LogLevel,
   101  		Source:    lagerLog.Source,
   102  		Message:   lagerLog.Message,
   103  		Session:   logSession,
   104  		Error:     logErr,
   105  		Trace:     logTrace,
   106  		Data:      data,
   107  	}, true
   108  }