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 }