github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/worker/logsender/worker.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package logsender 5 6 import ( 7 "fmt" 8 9 "github.com/juju/errors" 10 "github.com/juju/loggo" 11 12 "github.com/juju/juju/api/logsender" 13 "github.com/juju/juju/apiserver/params" 14 "github.com/juju/juju/worker" 15 ) 16 17 const loggerName = "juju.worker.logsender" 18 19 // New starts a logsender worker which reads log message structs from 20 // a channel and sends them to the JES via the logsink API. 21 func New(logs LogRecordCh, logSenderAPI *logsender.API) worker.Worker { 22 loop := func(stop <-chan struct{}) error { 23 logWriter, err := logSenderAPI.LogWriter() 24 if err != nil { 25 return errors.Annotate(err, "logsender dial failed") 26 } 27 defer logWriter.Close() 28 for { 29 select { 30 case rec := <-logs: 31 err := logWriter.WriteLog(¶ms.LogRecord{ 32 Time: rec.Time, 33 Module: rec.Module, 34 Location: rec.Location, 35 Level: rec.Level.String(), 36 Message: rec.Message, 37 }) 38 if err != nil { 39 return errors.Trace(err) 40 } 41 if rec.DroppedAfter > 0 { 42 // If messages were dropped after this one, report 43 // the count (the source of the log messages - 44 // BufferedLogWriter - handles the actual dropping 45 // and counting). 46 // 47 // Any logs indicated as dropped here are will 48 // never end up in the logs DB in the JES 49 // (although will still be in the local agent log 50 // file). Message dropping by the 51 // BufferedLogWriter is last resort protection 52 // against memory exhaustion and should only 53 // happen if API connectivity is lost for extended 54 // periods. The maximum in-memory log buffer is 55 // quite large (see the InstallBufferedLogWriter 56 // call in jujuDMain). 57 err := logWriter.WriteLog(¶ms.LogRecord{ 58 Time: rec.Time, 59 Module: loggerName, 60 Level: loggo.WARNING.String(), 61 Message: fmt.Sprintf("%d log messages dropped due to lack of API connectivity", rec.DroppedAfter), 62 }) 63 if err != nil { 64 return errors.Trace(err) 65 } 66 } 67 68 case <-stop: 69 return nil 70 } 71 } 72 } 73 return worker.NewSimpleWorker(loop) 74 }