github.com/jasonkeene/cli@v6.14.1-0.20160816203908-ca5715166dfb+incompatible/cf/api/logs/loggregator_message.go (about) 1 package logs 2 3 import ( 4 "strings" 5 "time" 6 "unicode/utf8" 7 8 "fmt" 9 10 "github.com/cloudfoundry/cli/cf/terminal" 11 "github.com/cloudfoundry/loggregatorlib/logmessage" 12 ) 13 14 type loggregatorLogMessage struct { 15 msg *logmessage.LogMessage 16 } 17 18 func NewLoggregatorLogMessage(m *logmessage.LogMessage) *loggregatorLogMessage { 19 return &loggregatorLogMessage{ 20 msg: m, 21 } 22 } 23 24 func (m *loggregatorLogMessage) GetSourceName() string { 25 return m.msg.GetSourceName() 26 } 27 28 func (m *loggregatorLogMessage) ToLog(loc *time.Location) string { 29 logMsg := m.msg 30 31 sourceName := logMsg.GetSourceName() 32 sourceID := logMsg.GetSourceId() 33 t := time.Unix(0, logMsg.GetTimestamp()) 34 timeFormat := "2006-01-02T15:04:05.00-0700" 35 timeString := t.In(loc).Format(timeFormat) 36 37 var logHeader string 38 39 if sourceID == "" { 40 logHeader = fmt.Sprintf("%s [%s]", timeString, sourceName) 41 } else { 42 logHeader = fmt.Sprintf("%s [%s/%s]", timeString, sourceName, sourceID) 43 } 44 45 coloredLogHeader := terminal.LogSysHeaderColor(logHeader) 46 47 // Calculate padding 48 longestHeader := fmt.Sprintf("%s [HEALTH/10] ", timeFormat) 49 expectedHeaderLength := utf8.RuneCountInString(longestHeader) 50 headerPadding := strings.Repeat(" ", max(0, expectedHeaderLength-utf8.RuneCountInString(logHeader))) 51 52 logHeader = logHeader + headerPadding 53 coloredLogHeader = coloredLogHeader + headerPadding 54 55 msgText := string(logMsg.GetMessage()) 56 msgText = strings.TrimRight(msgText, "\r\n") 57 58 msgLines := strings.Split(msgText, "\n") 59 contentPadding := strings.Repeat(" ", utf8.RuneCountInString(logHeader)) 60 coloringFunc := terminal.LogStdoutColor 61 logType := "OUT" 62 63 if logMsg.GetMessageType() == logmessage.LogMessage_ERR { 64 coloringFunc = terminal.LogStderrColor 65 logType = "ERR" 66 } 67 68 logContent := fmt.Sprintf("%s %s", logType, msgLines[0]) 69 for _, msgLine := range msgLines[1:] { 70 logContent = fmt.Sprintf("%s\n%s%s", logContent, contentPadding, msgLine) 71 } 72 73 logContent = coloringFunc(logContent) 74 75 return fmt.Sprintf("%s%s", coloredLogHeader, logContent) 76 } 77 78 func (m *loggregatorLogMessage) ToSimpleLog() string { 79 msgText := string(m.msg.GetMessage()) 80 81 return strings.TrimRight(msgText, "\r\n") 82 }