github.com/fabiokung/docker@v0.11.2-0.20170222101415-4534dcd49497/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(info logger.Info) (logger.Logger, error) { 39 logrus.WithField("container", info.ContainerID). 40 WithField("token", info.Config[token]). 41 Debug("logging driver logentries configured") 42 43 log, err := le_go.Connect(info.Config[token]) 44 if err != nil { 45 return nil, err 46 } 47 return &logentries{ 48 containerID: info.ContainerID, 49 containerName: info.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 ts := msg.Timestamp 65 logger.PutMessage(msg) 66 f.writer.Println(f.tag, ts, data) 67 return nil 68 } 69 70 func (f *logentries) Close() error { 71 return f.writer.Close() 72 } 73 74 func (f *logentries) Name() string { 75 return name 76 } 77 78 // ValidateLogOpt looks for logentries specific log option logentries-address. 79 func ValidateLogOpt(cfg map[string]string) error { 80 for key := range cfg { 81 switch key { 82 case "env": 83 case "labels": 84 case "tag": 85 case key: 86 default: 87 return fmt.Errorf("unknown log opt '%s' for logentries log driver", key) 88 } 89 } 90 91 if cfg[token] == "" { 92 return fmt.Errorf("Missing logentries token") 93 } 94 95 return nil 96 }