func (instance *Instance) publishLineAs(pub *zmqpubsub.Publisher, source string, logname string, line *tail.Line) { if line == nil { panic("line is nil") } msg := &message.Message{ LogFilename: logname, Source: source, InstanceIndex: instance.Index, AppGUID: instance.AppGUID, AppName: instance.AppName, AppSpace: instance.AppSpace, MessageCommon: common.NewMessageCommon(line.Text, line.Time, util.LocalNodeId()), } if line.Err != nil { // Mark this as a special error record, as it is // coming from tail, not the app. msg.Source = fmt.Sprintf("%v[apptail]", util.GetBrandName()) msg.LogFilename = "" log.Warnf("[%s] %s", instance.AppName, line.Text) } err := msg.Publish(pub, false) if err != nil { common.Fatal("Unable to publish: %v", err) } }
// Make relevant cloud events available in application logs. Heroku style. func MonitorCloudEvents() { sub := logyard.Broker.Subscribe("event.timeline") defer sub.Stop() pub := logyard.Broker.NewPublisherMust() defer pub.Stop() log.Info("Listening for app relevant cloud events...") for msg := range sub.Ch { var event sieve.Event err := json.Unmarshal([]byte(msg.Value), &event) if err != nil { common.Fatal("%v", err) // not expected at all } // Re-parse the event json record into a TimelineEvent structure. var t TimelineEvent if data, err := json.Marshal(event.Info); err != nil { common.Fatal("%v", err) } else { err = json.Unmarshal(data, &t) if err != nil { common.Fatal("Invalid timeline event: %v", err) } } var source string brandname := util.GetBrandName() if t.InstanceIndex > -1 { source = fmt.Sprintf("%v[%v.%v]", brandname, event.Process, t.InstanceIndex) } else { source = fmt.Sprintf("%v[%v]", brandname, event.Process) } PublishAppLog(pub, t, source, &event) } log.Warn("Finished listening for app relevant cloud events.") err := sub.Wait() if err != nil { common.Fatal("%v", err) } }