github.com/dcarley/cf-cli@v6.24.1-0.20170220111324-4225ff346898+incompatible/actor/v2action/logging.go (about) 1 package v2action 2 3 import ( 4 "time" 5 6 "github.com/cloudfoundry/sonde-go/events" 7 ) 8 9 type LogMessage struct { 10 message string 11 messageType events.LogMessage_MessageType 12 timestamp time.Time 13 sourceType string 14 sourceInstance string 15 } 16 17 func (log LogMessage) Message() string { 18 return log.message 19 } 20 21 func (log LogMessage) Type() string { 22 if log.messageType == events.LogMessage_OUT { 23 return "OUT" 24 } 25 return "ERR" 26 } 27 28 func (log LogMessage) Timestamp() time.Time { 29 return log.timestamp 30 } 31 32 func (log LogMessage) SourceType() string { 33 return log.sourceType 34 } 35 36 func (log LogMessage) SourceInstance() string { 37 return log.sourceInstance 38 } 39 40 func NewLogMessage(message string, messageType int, timestamp time.Time, sourceType string, sourceInstance string) *LogMessage { 41 return &LogMessage{ 42 message: message, 43 messageType: events.LogMessage_MessageType(messageType), 44 timestamp: timestamp, 45 sourceType: sourceType, 46 sourceInstance: sourceInstance, 47 } 48 } 49 50 func (actor Actor) GetStreamingLogs(appGUID string, client NOAAClient) (<-chan *LogMessage, <-chan error) { 51 // Do not pass in token because client should have a TokenRefresher set 52 eventStream, errStream := client.TailingLogs(appGUID, "") 53 54 messages := make(chan *LogMessage) 55 errs := make(chan error) 56 57 go func() { 58 defer close(messages) 59 defer close(errs) 60 61 dance: 62 for { 63 select { 64 case event, ok := <-eventStream: 65 if !ok { 66 break dance 67 } 68 69 messages <- &LogMessage{ 70 message: string(event.GetMessage()), 71 messageType: event.GetMessageType(), 72 timestamp: time.Unix(0, event.GetTimestamp()), 73 sourceInstance: event.GetSourceInstance(), 74 sourceType: event.GetSourceType(), 75 } 76 case err, ok := <-errStream: 77 if !ok { 78 break dance 79 } 80 errs <- err 81 } 82 } 83 }() 84 85 return messages, errs 86 }