gopkg.in/dotcloud/docker.v1@v1.13.1/daemon/logger/logentries/logentries.go (about)

     1  // Package logentries provides the log driver for forwarding server logs
     2  // to logentries endpoints.
     3  package logentries
     4  
     5  import (
     6  	"fmt"
     7  
     8  	"github.com/Sirupsen/logrus"
     9  	"github.com/bsphere/le_go"
    10  	"github.com/docker/docker/daemon/logger"
    11  )
    12  
    13  type logentries struct {
    14  	tag           string
    15  	containerID   string
    16  	containerName string
    17  	writer        *le_go.Logger
    18  	extra         map[string]string
    19  }
    20  
    21  const (
    22  	name  = "logentries"
    23  	token = "logentries-token"
    24  )
    25  
    26  func init() {
    27  	if err := logger.RegisterLogDriver(name, New); err != nil {
    28  		logrus.Fatal(err)
    29  	}
    30  	if err := logger.RegisterLogOptValidator(name, ValidateLogOpt); err != nil {
    31  		logrus.Fatal(err)
    32  	}
    33  }
    34  
    35  // New creates a logentries logger using the configuration passed in on
    36  // the context. The supported context configuration variable is
    37  // logentries-token.
    38  func New(ctx logger.Context) (logger.Logger, error) {
    39  	logrus.WithField("container", ctx.ContainerID).
    40  		WithField("token", ctx.Config[token]).
    41  		Debug("logging driver logentries configured")
    42  
    43  	log, err := le_go.Connect(ctx.Config[token])
    44  	if err != nil {
    45  		return nil, err
    46  	}
    47  	return &logentries{
    48  		containerID:   ctx.ContainerID,
    49  		containerName: ctx.ContainerName,
    50  		writer:        log,
    51  	}, nil
    52  }
    53  
    54  func (f *logentries) Log(msg *logger.Message) error {
    55  	data := map[string]string{
    56  		"container_id":   f.containerID,
    57  		"container_name": f.containerName,
    58  		"source":         msg.Source,
    59  		"log":            string(msg.Line),
    60  	}
    61  	for k, v := range f.extra {
    62  		data[k] = v
    63  	}
    64  	f.writer.Println(f.tag, msg.Timestamp, data)
    65  	return nil
    66  }
    67  
    68  func (f *logentries) Close() error {
    69  	return f.writer.Close()
    70  }
    71  
    72  func (f *logentries) Name() string {
    73  	return name
    74  }
    75  
    76  // ValidateLogOpt looks for logentries specific log option logentries-address.
    77  func ValidateLogOpt(cfg map[string]string) error {
    78  	for key := range cfg {
    79  		switch key {
    80  		case "env":
    81  		case "labels":
    82  		case "tag":
    83  		case key:
    84  		default:
    85  			return fmt.Errorf("unknown log opt '%s' for logentries log driver", key)
    86  		}
    87  	}
    88  
    89  	if cfg[token] == "" {
    90  		return fmt.Errorf("Missing logentries token")
    91  	}
    92  
    93  	return nil
    94  }