github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/api/logsender/logsender.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 // Package logsender implements the API for storing log 5 // messages on the API server. 6 package logsender 7 8 import ( 9 "io" 10 11 "github.com/juju/errors" 12 13 "github.com/juju/juju/api/base" 14 "github.com/juju/juju/apiserver/params" 15 ) 16 17 // LogWriter is the interface that allows sending log 18 // messages to the server for storage. 19 type LogWriter interface { 20 // WriteLog writes the given log record. 21 WriteLog(*params.LogRecord) error 22 23 io.Closer 24 } 25 26 // API provides access to the LogSender API. 27 type API struct { 28 connector base.StreamConnector 29 } 30 31 // NewAPI creates a new client-side logsender API. 32 func NewAPI(connector base.StreamConnector) *API { 33 return &API{connector: connector} 34 } 35 36 // LogWriter returns a new log writer interface value 37 // which must be closed when finished with. 38 func (api *API) LogWriter() (LogWriter, error) { 39 conn, err := api.connector.ConnectStream("/logsink", nil) 40 if err != nil { 41 return nil, errors.Annotatef(err, "cannot connect to /logsink") 42 } 43 return writer{conn}, nil 44 } 45 46 type writer struct { 47 conn base.Stream 48 } 49 50 func (w writer) WriteLog(m *params.LogRecord) error { 51 // Note: due to the fire-and-forget nature of the 52 // logsink API, it is possible that when the 53 // connection dies, any logs that were "in-flight" 54 // will not be recorded on the server side. 55 if err := w.conn.WriteJSON(m); err != nil { 56 return errors.Annotatef(err, "cannot send log message") 57 } 58 return nil 59 } 60 61 func (w writer) Close() error { 62 return w.conn.Close() 63 }