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  }