diff --git a/daemon/logger/fluentd/fluentd.go b/daemon/logger/fluentd/fluentd.go index cf7f3e9985a16..2ed91df19fccd 100644 --- a/daemon/logger/fluentd/fluentd.go +++ b/daemon/logger/fluentd/fluentd.go @@ -192,6 +192,7 @@ func ValidateLogOpt(cfg map[string]string) error { case "env": case "env-regex": case "labels": + case "labels-regex": case "tag": case addressKey: case bufferLimitKey: diff --git a/daemon/logger/gcplogs/gcplogging.go b/daemon/logger/gcplogs/gcplogging.go index 1699f67a2d5be..a8ff4fda3da9b 100644 --- a/daemon/logger/gcplogs/gcplogging.go +++ b/daemon/logger/gcplogs/gcplogging.go @@ -18,14 +18,15 @@ import ( const ( name = "gcplogs" - projectOptKey = "gcp-project" - logLabelsKey = "labels" - logEnvKey = "env" - logEnvRegexKey = "env-regex" - logCmdKey = "gcp-log-cmd" - logZoneKey = "gcp-meta-zone" - logNameKey = "gcp-meta-name" - logIDKey = "gcp-meta-id" + projectOptKey = "gcp-project" + logLabelsKey = "labels" + logLabelsRegexKey = "labels-regex" + logEnvKey = "env" + logEnvRegexKey = "env-regex" + logCmdKey = "gcp-log-cmd" + logZoneKey = "gcp-meta-zone" + logNameKey = "gcp-meta-name" + logIDKey = "gcp-meta-id" ) var ( @@ -210,7 +211,7 @@ func New(info logger.Info) (logger.Logger, error) { func ValidateLogOpts(cfg map[string]string) error { for k := range cfg { switch k { - case projectOptKey, logLabelsKey, logEnvKey, logEnvRegexKey, logCmdKey, logZoneKey, logNameKey, logIDKey: + case projectOptKey, logLabelsKey, logLabelsRegexKey, logEnvKey, logEnvRegexKey, logCmdKey, logZoneKey, logNameKey, logIDKey: default: return fmt.Errorf("%q is not a valid option for the gcplogs driver", k) } diff --git a/daemon/logger/gelf/gelf.go b/daemon/logger/gelf/gelf.go index e9c860406a641..ab1393cedccf8 100644 --- a/daemon/logger/gelf/gelf.go +++ b/daemon/logger/gelf/gelf.go @@ -207,6 +207,7 @@ func ValidateLogOpt(cfg map[string]string) error { case "gelf-address": case "tag": case "labels": + case "labels-regex": case "env": case "env-regex": case "gelf-compression-level": diff --git a/daemon/logger/gelf/gelf_test.go b/daemon/logger/gelf/gelf_test.go index 3610bc6d3ac60..4ba7d1d545e3f 100644 --- a/daemon/logger/gelf/gelf_test.go +++ b/daemon/logger/gelf/gelf_test.go @@ -98,6 +98,7 @@ func TestUDPValidateLogOpt(t *testing.T) { "gelf-address": "udp://127.0.0.1:12201", "tag": "testtag", "labels": "testlabel", + "labels-regex": "testlabel-regex", "env": "testenv", "env-regex": "testenv-regex", "gelf-compression-level": "9", diff --git a/daemon/logger/journald/journald.go b/daemon/logger/journald/journald.go index 8750cae093072..508ca23f49c0c 100644 --- a/daemon/logger/journald/journald.go +++ b/daemon/logger/journald/journald.go @@ -90,6 +90,7 @@ func validateLogOpt(cfg map[string]string) error { for key := range cfg { switch key { case "labels": + case "labels-regex": case "env": case "env-regex": case "tag": diff --git a/daemon/logger/jsonfilelog/jsonfilelog.go b/daemon/logger/jsonfilelog/jsonfilelog.go index bbb8eeb7ec3a9..e59f3bf6a55c4 100644 --- a/daemon/logger/jsonfilelog/jsonfilelog.go +++ b/daemon/logger/jsonfilelog/jsonfilelog.go @@ -156,6 +156,7 @@ func ValidateLogOpt(cfg map[string]string) error { case "max-size": case "compress": case "labels": + case "labels-regex": case "env": case "env-regex": case "tag": diff --git a/daemon/logger/jsonfilelog/jsonfilelog_test.go b/daemon/logger/jsonfilelog/jsonfilelog_test.go index 8e66e6455a4b5..97265a7fc77e0 100644 --- a/daemon/logger/jsonfilelog/jsonfilelog_test.go +++ b/daemon/logger/jsonfilelog/jsonfilelog_test.go @@ -277,12 +277,12 @@ func TestJSONFileLoggerWithLabelsEnv(t *testing.T) { } defer os.RemoveAll(tmp) filename := filepath.Join(tmp, "container.log") - config := map[string]string{"labels": "rack,dc", "env": "environ,debug,ssl", "env-regex": "^dc"} + config := map[string]string{"labels": "rack,dc", "labels-regex": "^loc", "env": "environ,debug,ssl", "env-regex": "^dc"} l, err := New(logger.Info{ ContainerID: cid, LogPath: filename, Config: config, - ContainerLabels: map[string]string{"rack": "101", "dc": "lhr"}, + ContainerLabels: map[string]string{"rack": "101", "dc": "lhr", "location": "here"}, ContainerEnv: []string{"environ=production", "debug=false", "port=10001", "ssl=true", "dc_region=west"}, }) if err != nil { @@ -308,6 +308,7 @@ func TestJSONFileLoggerWithLabelsEnv(t *testing.T) { expected := map[string]string{ "rack": "101", "dc": "lhr", + "location": "here", "environ": "production", "debug": "false", "ssl": "true", diff --git a/daemon/logger/logentries/logentries.go b/daemon/logger/logentries/logentries.go index 70a8baf66ee70..013b182d825e6 100644 --- a/daemon/logger/logentries/logentries.go +++ b/daemon/logger/logentries/logentries.go @@ -100,6 +100,7 @@ func ValidateLogOpt(cfg map[string]string) error { case "env": case "env-regex": case "labels": + case "labels-regex": case "tag": case key: default: diff --git a/daemon/logger/loginfo.go b/daemon/logger/loginfo.go index 4c48235f5c73b..947abd97af475 100644 --- a/daemon/logger/loginfo.go +++ b/daemon/logger/loginfo.go @@ -41,6 +41,22 @@ func (info *Info) ExtraAttributes(keyMod func(string) string) (map[string]string } } + labelsRegex, ok := info.Config["labels-regex"] + if ok && len(labels) > 0 { + re, err := regexp.Compile(labelsRegex) + if err != nil { + return nil, err + } + for k, v := range info.ContainerLabels { + if re.MatchString(k) { + if keyMod != nil { + k = keyMod(k) + } + extra[k] = v + } + } + } + envMapping := make(map[string]string) for _, e := range info.ContainerEnv { if kv := strings.SplitN(e, "=", 2); len(kv) == 2 { diff --git a/daemon/logger/splunk/splunk.go b/daemon/logger/splunk/splunk.go index 8756ffa3b2928..331bbfa5ce926 100644 --- a/daemon/logger/splunk/splunk.go +++ b/daemon/logger/splunk/splunk.go @@ -44,6 +44,7 @@ const ( envKey = "env" envRegexKey = "env-regex" labelsKey = "labels" + labelsRegexKey = "labels-regex" tagKey = "tag" ) @@ -565,6 +566,7 @@ func ValidateLogOpt(cfg map[string]string) error { case envKey: case envRegexKey: case labelsKey: + case labelsRegexKey: case tagKey: default: return fmt.Errorf("unknown log opt '%s' for %s log driver", key, driverName) diff --git a/daemon/logger/syslog/syslog.go b/daemon/logger/syslog/syslog.go index 61f9f14345be3..70d77594d95ae 100644 --- a/daemon/logger/syslog/syslog.go +++ b/daemon/logger/syslog/syslog.go @@ -189,6 +189,7 @@ func ValidateLogOpt(cfg map[string]string) error { case "env": case "env-regex": case "labels": + case "labels-regex": case "syslog-address": case "syslog-facility": case "syslog-tls-ca-cert": diff --git a/daemon/logger/syslog/syslog_test.go b/daemon/logger/syslog/syslog_test.go index ea531a243f942..fbba836e1157c 100644 --- a/daemon/logger/syslog/syslog_test.go +++ b/daemon/logger/syslog/syslog_test.go @@ -137,6 +137,7 @@ func TestValidateLogOpt(t *testing.T) { "env": "http://127.0.0.1", "env-regex": "abc", "labels": "labelA", + "labels-regex": "def", "syslog-address": "udp://1.2.3.4:1111", "syslog-facility": "daemon", "syslog-tls-ca-cert": "/etc/ca-certificates/custom/ca.pem",