Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>
| ... | ... |
@@ -9,6 +9,7 @@ import ( |
| 9 | 9 |
_ "github.com/docker/docker/daemon/logger/gelf" |
| 10 | 10 |
_ "github.com/docker/docker/daemon/logger/journald" |
| 11 | 11 |
_ "github.com/docker/docker/daemon/logger/jsonfilelog" |
| 12 |
+ _ "github.com/docker/docker/daemon/logger/logentries" |
|
| 12 | 13 |
_ "github.com/docker/docker/daemon/logger/splunk" |
| 13 | 14 |
_ "github.com/docker/docker/daemon/logger/syslog" |
| 14 | 15 |
) |
| ... | ... |
@@ -6,6 +6,7 @@ import ( |
| 6 | 6 |
_ "github.com/docker/docker/daemon/logger/awslogs" |
| 7 | 7 |
_ "github.com/docker/docker/daemon/logger/etwlogs" |
| 8 | 8 |
_ "github.com/docker/docker/daemon/logger/jsonfilelog" |
| 9 |
+ _ "github.com/docker/docker/daemon/logger/logentries" |
|
| 9 | 10 |
_ "github.com/docker/docker/daemon/logger/splunk" |
| 10 | 11 |
_ "github.com/docker/docker/daemon/logger/syslog" |
| 11 | 12 |
) |
| 12 | 13 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,94 @@ |
| 0 |
+// Package logentries provides the log driver for forwarding server logs |
|
| 1 |
+// to logentries endpoints. |
|
| 2 |
+package logentries |
|
| 3 |
+ |
|
| 4 |
+import ( |
|
| 5 |
+ "fmt" |
|
| 6 |
+ |
|
| 7 |
+ "github.com/Sirupsen/logrus" |
|
| 8 |
+ "github.com/bsphere/le_go" |
|
| 9 |
+ "github.com/docker/docker/daemon/logger" |
|
| 10 |
+) |
|
| 11 |
+ |
|
| 12 |
+type logentries struct {
|
|
| 13 |
+ tag string |
|
| 14 |
+ containerID string |
|
| 15 |
+ containerName string |
|
| 16 |
+ writer *le_go.Logger |
|
| 17 |
+ extra map[string]string |
|
| 18 |
+} |
|
| 19 |
+ |
|
| 20 |
+const ( |
|
| 21 |
+ name = "logentries" |
|
| 22 |
+ token = "logentries-token" |
|
| 23 |
+) |
|
| 24 |
+ |
|
| 25 |
+func init() {
|
|
| 26 |
+ if err := logger.RegisterLogDriver(name, New); err != nil {
|
|
| 27 |
+ logrus.Fatal(err) |
|
| 28 |
+ } |
|
| 29 |
+ if err := logger.RegisterLogOptValidator(name, ValidateLogOpt); err != nil {
|
|
| 30 |
+ logrus.Fatal(err) |
|
| 31 |
+ } |
|
| 32 |
+} |
|
| 33 |
+ |
|
| 34 |
+// New creates a logentries logger using the configuration passed in on |
|
| 35 |
+// the context. The supported context configuration variable is |
|
| 36 |
+// logentries-token. |
|
| 37 |
+func New(ctx logger.Context) (logger.Logger, error) {
|
|
| 38 |
+ logrus.WithField("container", ctx.ContainerID).
|
|
| 39 |
+ WithField("token", ctx.Config[token]).
|
|
| 40 |
+ Debug("logging driver logentries configured")
|
|
| 41 |
+ |
|
| 42 |
+ log, err := le_go.Connect(ctx.Config[token]) |
|
| 43 |
+ if err != nil {
|
|
| 44 |
+ return nil, err |
|
| 45 |
+ } |
|
| 46 |
+ return &logentries{
|
|
| 47 |
+ containerID: ctx.ContainerID, |
|
| 48 |
+ containerName: ctx.ContainerName, |
|
| 49 |
+ writer: log, |
|
| 50 |
+ }, nil |
|
| 51 |
+} |
|
| 52 |
+ |
|
| 53 |
+func (f *logentries) Log(msg *logger.Message) error {
|
|
| 54 |
+ data := map[string]string{
|
|
| 55 |
+ "container_id": f.containerID, |
|
| 56 |
+ "container_name": f.containerName, |
|
| 57 |
+ "source": msg.Source, |
|
| 58 |
+ "log": string(msg.Line), |
|
| 59 |
+ } |
|
| 60 |
+ for k, v := range f.extra {
|
|
| 61 |
+ data[k] = v |
|
| 62 |
+ } |
|
| 63 |
+ f.writer.Println(f.tag, msg.Timestamp, data) |
|
| 64 |
+ return nil |
|
| 65 |
+} |
|
| 66 |
+ |
|
| 67 |
+func (f *logentries) Close() error {
|
|
| 68 |
+ return f.writer.Close() |
|
| 69 |
+} |
|
| 70 |
+ |
|
| 71 |
+func (f *logentries) Name() string {
|
|
| 72 |
+ return name |
|
| 73 |
+} |
|
| 74 |
+ |
|
| 75 |
+// ValidateLogOpt looks for logentries specific log option logentries-address. |
|
| 76 |
+func ValidateLogOpt(cfg map[string]string) error {
|
|
| 77 |
+ for key := range cfg {
|
|
| 78 |
+ switch key {
|
|
| 79 |
+ case "env": |
|
| 80 |
+ case "labels": |
|
| 81 |
+ case "tag": |
|
| 82 |
+ case key: |
|
| 83 |
+ default: |
|
| 84 |
+ return fmt.Errorf("unknown log opt '%s' for logentries log driver", key)
|
|
| 85 |
+ } |
|
| 86 |
+ } |
|
| 87 |
+ |
|
| 88 |
+ if cfg[token] == "" {
|
|
| 89 |
+ return fmt.Errorf("Missing logentries token")
|
|
| 90 |
+ } |
|
| 91 |
+ |
|
| 92 |
+ return nil |
|
| 93 |
+} |
| 0 | 94 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,42 @@ |
| 0 |
+<!--[metadata]> |
|
| 1 |
+aliases = ["/engine/reference/logging/logentries/"] |
|
| 2 |
+title = "Logentries logging driver" |
|
| 3 |
+description = "Describes how to use the Logentries logging driver." |
|
| 4 |
+keywords = ["logentries, docker, logging, driver"] |
|
| 5 |
+[menu.main] |
|
| 6 |
+parent = "smn_logging" |
|
| 7 |
+weight = 2 |
|
| 8 |
+<![end-metadata]--> |
|
| 9 |
+ |
|
| 10 |
+# Logentries logging driver |
|
| 11 |
+ |
|
| 12 |
+The `logentries` logging driver sends container logs to the Logentries server. |
|
| 13 |
+ |
|
| 14 |
+## Usage |
|
| 15 |
+ |
|
| 16 |
+You can configure the default logging driver by passing the `--log-driver` |
|
| 17 |
+option to the Docker daemon: |
|
| 18 |
+ |
|
| 19 |
+ docker daemon --log-driver=logentries |
|
| 20 |
+ |
|
| 21 |
+You can set the logging driver for a specific container by using the |
|
| 22 |
+`--log-driver` option to `docker run`: |
|
| 23 |
+ |
|
| 24 |
+ docker run --log-driver=logentries ... |
|
| 25 |
+ |
|
| 26 |
+## Logentries options |
|
| 27 |
+ |
|
| 28 |
+You can use the `--log-opt NAME=VALUE` flag to specify these additional |
|
| 29 |
+Logentries logging driver options: |
|
| 30 |
+ |
|
| 31 |
+| Option | Required | Description | |
|
| 32 |
+|-----------------------------|----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |
|
| 33 |
+| `logentries-token` | required | Logentries token. | |
|
| 34 |
+ |
|
| 35 |
+An example usage would be somethig like: |
|
| 36 |
+ |
|
| 37 |
+ docker run --log-driver=logentries \ |
|
| 38 |
+ --log-opt logentries-token=176FCEBF-4CF5-4EDF-91BC-703796522D20 \ |
|
| 39 |
+ your/application |