Signed-off-by: Yanqiang Miao <miao.yanqiang@zte.com.cn>
gofmt
Signed-off-by: Yanqiang Miao <miao.yanqiang@zte.com.cn>
update
Signed-off-by: Yanqiang Miao <miao.yanqiang@zte.com.cn>
remove 'api/types/container/config.go' from this PR
Signed-off-by: Yanqiang Miao <miao.yanqiang@zte.com.cn>
change 'LogInfo' to 'Info'
Signed-off-by: Yanqiang Miao <miao.yanqiang@zte.com.cn>
update
Signed-off-by: Yanqiang Miao <miao.yanqiang@zte.com.cn>
... | ... |
@@ -328,7 +328,7 @@ func (container *Container) StartLogger() (logger.Logger, error) { |
328 | 328 |
if err != nil { |
329 | 329 |
return nil, fmt.Errorf("failed to get logging factory: %v", err) |
330 | 330 |
} |
331 |
- ctx := logger.Context{ |
|
331 |
+ info := logger.Info{ |
|
332 | 332 |
Config: cfg.Config, |
333 | 333 |
ContainerID: container.ID, |
334 | 334 |
ContainerName: container.Name, |
... | ... |
@@ -344,12 +344,12 @@ func (container *Container) StartLogger() (logger.Logger, error) { |
344 | 344 |
|
345 | 345 |
// Set logging file for "json-logger" |
346 | 346 |
if cfg.Type == jsonfilelog.Name { |
347 |
- ctx.LogPath, err = container.GetRootResourcePath(fmt.Sprintf("%s-json.log", container.ID)) |
|
347 |
+ info.LogPath, err = container.GetRootResourcePath(fmt.Sprintf("%s-json.log", container.ID)) |
|
348 | 348 |
if err != nil { |
349 | 349 |
return nil, err |
350 | 350 |
} |
351 | 351 |
} |
352 |
- return c(ctx) |
|
352 |
+ return c(info) |
|
353 | 353 |
} |
354 | 354 |
|
355 | 355 |
// GetProcessLabel returns the process label for the container. |
... | ... |
@@ -88,17 +88,17 @@ func init() { |
88 | 88 |
// also taken from environment variables AWS_REGION, AWS_ACCESS_KEY_ID, |
89 | 89 |
// AWS_SECRET_ACCESS_KEY, the shared credentials file (~/.aws/credentials), and |
90 | 90 |
// the EC2 Instance Metadata Service. |
91 |
-func New(ctx logger.Context) (logger.Logger, error) { |
|
92 |
- logGroupName := ctx.Config[logGroupKey] |
|
93 |
- logStreamName, err := loggerutils.ParseLogTag(ctx, "{{.FullID}}") |
|
91 |
+func New(info logger.Info) (logger.Logger, error) { |
|
92 |
+ logGroupName := info.Config[logGroupKey] |
|
93 |
+ logStreamName, err := loggerutils.ParseLogTag(info, "{{.FullID}}") |
|
94 | 94 |
if err != nil { |
95 | 95 |
return nil, err |
96 | 96 |
} |
97 | 97 |
|
98 |
- if ctx.Config[logStreamKey] != "" { |
|
99 |
- logStreamName = ctx.Config[logStreamKey] |
|
98 |
+ if info.Config[logStreamKey] != "" { |
|
99 |
+ logStreamName = info.Config[logStreamKey] |
|
100 | 100 |
} |
101 |
- client, err := newAWSLogsClient(ctx) |
|
101 |
+ client, err := newAWSLogsClient(info) |
|
102 | 102 |
if err != nil { |
103 | 103 |
return nil, err |
104 | 104 |
} |
... | ... |
@@ -127,13 +127,13 @@ var newRegionFinder = func() regionFinder { |
127 | 127 |
// Customizations to the default client from the SDK include a Docker-specific |
128 | 128 |
// User-Agent string and automatic region detection using the EC2 Instance |
129 | 129 |
// Metadata Service when region is otherwise unspecified. |
130 |
-func newAWSLogsClient(ctx logger.Context) (api, error) { |
|
130 |
+func newAWSLogsClient(info logger.Info) (api, error) { |
|
131 | 131 |
var region *string |
132 | 132 |
if os.Getenv(regionEnvKey) != "" { |
133 | 133 |
region = aws.String(os.Getenv(regionEnvKey)) |
134 | 134 |
} |
135 |
- if ctx.Config[regionKey] != "" { |
|
136 |
- region = aws.String(ctx.Config[regionKey]) |
|
135 |
+ if info.Config[regionKey] != "" { |
|
136 |
+ region = aws.String(info.Config[regionKey]) |
|
137 | 137 |
} |
138 | 138 |
if region == nil || *region == "" { |
139 | 139 |
logrus.Info("Trying to get region from EC2 Metadata") |
... | ... |
@@ -28,13 +28,13 @@ const ( |
28 | 28 |
) |
29 | 29 |
|
30 | 30 |
func TestNewAWSLogsClientUserAgentHandler(t *testing.T) { |
31 |
- ctx := logger.Context{ |
|
31 |
+ info := logger.Info{ |
|
32 | 32 |
Config: map[string]string{ |
33 | 33 |
regionKey: "us-east-1", |
34 | 34 |
}, |
35 | 35 |
} |
36 | 36 |
|
37 |
- client, err := newAWSLogsClient(ctx) |
|
37 |
+ client, err := newAWSLogsClient(info) |
|
38 | 38 |
if err != nil { |
39 | 39 |
t.Fatal(err) |
40 | 40 |
} |
... | ... |
@@ -59,7 +59,7 @@ func TestNewAWSLogsClientUserAgentHandler(t *testing.T) { |
59 | 59 |
} |
60 | 60 |
|
61 | 61 |
func TestNewAWSLogsClientRegionDetect(t *testing.T) { |
62 |
- ctx := logger.Context{ |
|
62 |
+ info := logger.Info{ |
|
63 | 63 |
Config: map[string]string{}, |
64 | 64 |
} |
65 | 65 |
|
... | ... |
@@ -71,7 +71,7 @@ func TestNewAWSLogsClientRegionDetect(t *testing.T) { |
71 | 71 |
successResult: "us-east-1", |
72 | 72 |
} |
73 | 73 |
|
74 |
- _, err := newAWSLogsClient(ctx) |
|
74 |
+ _, err := newAWSLogsClient(info) |
|
75 | 75 |
if err != nil { |
76 | 76 |
t.Fatal(err) |
77 | 77 |
} |
... | ... |
@@ -695,12 +695,12 @@ func TestCollectBatchWithDuplicateTimestamps(t *testing.T) { |
695 | 695 |
|
696 | 696 |
func TestCreateTagSuccess(t *testing.T) { |
697 | 697 |
mockClient := newMockClient() |
698 |
- ctx := logger.Context{ |
|
698 |
+ info := logger.Info{ |
|
699 | 699 |
ContainerName: "/test-container", |
700 | 700 |
ContainerID: "container-abcdefghijklmnopqrstuvwxyz01234567890", |
701 | 701 |
Config: map[string]string{"tag": "{{.Name}}/{{.FullID}}"}, |
702 | 702 |
} |
703 |
- logStreamName, e := loggerutils.ParseLogTag(ctx, loggerutils.DefaultTemplate) |
|
703 |
+ logStreamName, e := loggerutils.ParseLogTag(info, loggerutils.DefaultTemplate) |
|
704 | 704 |
if e != nil { |
705 | 705 |
t.Errorf("Error generating tag: %q", e) |
706 | 706 |
} |
707 | 707 |
deleted file mode 100644 |
... | ... |
@@ -1,111 +0,0 @@ |
1 |
-package logger |
|
2 |
- |
|
3 |
-import ( |
|
4 |
- "fmt" |
|
5 |
- "os" |
|
6 |
- "strings" |
|
7 |
- "time" |
|
8 |
-) |
|
9 |
- |
|
10 |
-// Context provides enough information for a logging driver to do its function. |
|
11 |
-type Context struct { |
|
12 |
- Config map[string]string |
|
13 |
- ContainerID string |
|
14 |
- ContainerName string |
|
15 |
- ContainerEntrypoint string |
|
16 |
- ContainerArgs []string |
|
17 |
- ContainerImageID string |
|
18 |
- ContainerImageName string |
|
19 |
- ContainerCreated time.Time |
|
20 |
- ContainerEnv []string |
|
21 |
- ContainerLabels map[string]string |
|
22 |
- LogPath string |
|
23 |
- DaemonName string |
|
24 |
-} |
|
25 |
- |
|
26 |
-// ExtraAttributes returns the user-defined extra attributes (labels, |
|
27 |
-// environment variables) in key-value format. This can be used by log drivers |
|
28 |
-// that support metadata to add more context to a log. |
|
29 |
-func (ctx *Context) ExtraAttributes(keyMod func(string) string) map[string]string { |
|
30 |
- extra := make(map[string]string) |
|
31 |
- labels, ok := ctx.Config["labels"] |
|
32 |
- if ok && len(labels) > 0 { |
|
33 |
- for _, l := range strings.Split(labels, ",") { |
|
34 |
- if v, ok := ctx.ContainerLabels[l]; ok { |
|
35 |
- if keyMod != nil { |
|
36 |
- l = keyMod(l) |
|
37 |
- } |
|
38 |
- extra[l] = v |
|
39 |
- } |
|
40 |
- } |
|
41 |
- } |
|
42 |
- |
|
43 |
- env, ok := ctx.Config["env"] |
|
44 |
- if ok && len(env) > 0 { |
|
45 |
- envMapping := make(map[string]string) |
|
46 |
- for _, e := range ctx.ContainerEnv { |
|
47 |
- if kv := strings.SplitN(e, "=", 2); len(kv) == 2 { |
|
48 |
- envMapping[kv[0]] = kv[1] |
|
49 |
- } |
|
50 |
- } |
|
51 |
- for _, l := range strings.Split(env, ",") { |
|
52 |
- if v, ok := envMapping[l]; ok { |
|
53 |
- if keyMod != nil { |
|
54 |
- l = keyMod(l) |
|
55 |
- } |
|
56 |
- extra[l] = v |
|
57 |
- } |
|
58 |
- } |
|
59 |
- } |
|
60 |
- |
|
61 |
- return extra |
|
62 |
-} |
|
63 |
- |
|
64 |
-// Hostname returns the hostname from the underlying OS. |
|
65 |
-func (ctx *Context) Hostname() (string, error) { |
|
66 |
- hostname, err := os.Hostname() |
|
67 |
- if err != nil { |
|
68 |
- return "", fmt.Errorf("logger: can not resolve hostname: %v", err) |
|
69 |
- } |
|
70 |
- return hostname, nil |
|
71 |
-} |
|
72 |
- |
|
73 |
-// Command returns the command that the container being logged was |
|
74 |
-// started with. The Entrypoint is prepended to the container |
|
75 |
-// arguments. |
|
76 |
-func (ctx *Context) Command() string { |
|
77 |
- terms := []string{ctx.ContainerEntrypoint} |
|
78 |
- terms = append(terms, ctx.ContainerArgs...) |
|
79 |
- command := strings.Join(terms, " ") |
|
80 |
- return command |
|
81 |
-} |
|
82 |
- |
|
83 |
-// ID Returns the Container ID shortened to 12 characters. |
|
84 |
-func (ctx *Context) ID() string { |
|
85 |
- return ctx.ContainerID[:12] |
|
86 |
-} |
|
87 |
- |
|
88 |
-// FullID is an alias of ContainerID. |
|
89 |
-func (ctx *Context) FullID() string { |
|
90 |
- return ctx.ContainerID |
|
91 |
-} |
|
92 |
- |
|
93 |
-// Name returns the ContainerName without a preceding '/'. |
|
94 |
-func (ctx *Context) Name() string { |
|
95 |
- return strings.TrimPrefix(ctx.ContainerName, "/") |
|
96 |
-} |
|
97 |
- |
|
98 |
-// ImageID returns the ContainerImageID shortened to 12 characters. |
|
99 |
-func (ctx *Context) ImageID() string { |
|
100 |
- return ctx.ContainerImageID[:12] |
|
101 |
-} |
|
102 |
- |
|
103 |
-// ImageFullID is an alias of ContainerImageID. |
|
104 |
-func (ctx *Context) ImageFullID() string { |
|
105 |
- return ctx.ContainerImageID |
|
106 |
-} |
|
107 |
- |
|
108 |
-// ImageName is an alias of ContainerImageName |
|
109 |
-func (ctx *Context) ImageName() string { |
|
110 |
- return ctx.ContainerImageName |
|
111 |
-} |
... | ... |
@@ -54,17 +54,17 @@ func init() { |
54 | 54 |
} |
55 | 55 |
|
56 | 56 |
// New creates a new etwLogs logger for the given container and registers the EWT provider. |
57 |
-func New(ctx logger.Context) (logger.Logger, error) { |
|
57 |
+func New(info logger.Info) (logger.Logger, error) { |
|
58 | 58 |
if err := registerETWProvider(); err != nil { |
59 | 59 |
return nil, err |
60 | 60 |
} |
61 |
- logrus.Debugf("logging driver etwLogs configured for container: %s.", ctx.ContainerID) |
|
61 |
+ logrus.Debugf("logging driver etwLogs configured for container: %s.", info.ContainerID) |
|
62 | 62 |
|
63 | 63 |
return &etwLogs{ |
64 |
- containerName: ctx.Name(), |
|
65 |
- imageName: ctx.ContainerImageName, |
|
66 |
- containerID: ctx.ContainerID, |
|
67 |
- imageID: ctx.ContainerImageID, |
|
64 |
+ containerName: info.Name(), |
|
65 |
+ imageName: info.ContainerImageName, |
|
66 |
+ containerID: info.ContainerID, |
|
67 |
+ imageID: info.ContainerImageID, |
|
68 | 68 |
}, nil |
69 | 69 |
} |
70 | 70 |
|
... | ... |
@@ -6,7 +6,7 @@ import ( |
6 | 6 |
) |
7 | 7 |
|
8 | 8 |
// Creator builds a logging driver instance with given context. |
9 |
-type Creator func(Context) (Logger, error) |
|
9 |
+type Creator func(Info) (Logger, error) |
|
10 | 10 |
|
11 | 11 |
// LogOptValidator checks the options specific to the underlying |
12 | 12 |
// logging implementation. |
... | ... |
@@ -67,22 +67,22 @@ func init() { |
67 | 67 |
// New creates a fluentd logger using the configuration passed in on |
68 | 68 |
// the context. The supported context configuration variable is |
69 | 69 |
// fluentd-address. |
70 |
-func New(ctx logger.Context) (logger.Logger, error) { |
|
71 |
- loc, err := parseAddress(ctx.Config[addressKey]) |
|
70 |
+func New(info logger.Info) (logger.Logger, error) { |
|
71 |
+ loc, err := parseAddress(info.Config[addressKey]) |
|
72 | 72 |
if err != nil { |
73 | 73 |
return nil, err |
74 | 74 |
} |
75 | 75 |
|
76 |
- tag, err := loggerutils.ParseLogTag(ctx, loggerutils.DefaultTemplate) |
|
76 |
+ tag, err := loggerutils.ParseLogTag(info, loggerutils.DefaultTemplate) |
|
77 | 77 |
if err != nil { |
78 | 78 |
return nil, err |
79 | 79 |
} |
80 | 80 |
|
81 |
- extra := ctx.ExtraAttributes(nil) |
|
81 |
+ extra := info.ExtraAttributes(nil) |
|
82 | 82 |
|
83 | 83 |
bufferLimit := defaultBufferLimit |
84 |
- if ctx.Config[bufferLimitKey] != "" { |
|
85 |
- bl64, err := units.RAMInBytes(ctx.Config[bufferLimitKey]) |
|
84 |
+ if info.Config[bufferLimitKey] != "" { |
|
85 |
+ bl64, err := units.RAMInBytes(info.Config[bufferLimitKey]) |
|
86 | 86 |
if err != nil { |
87 | 87 |
return nil, err |
88 | 88 |
} |
... | ... |
@@ -90,8 +90,8 @@ func New(ctx logger.Context) (logger.Logger, error) { |
90 | 90 |
} |
91 | 91 |
|
92 | 92 |
retryWait := defaultRetryWait |
93 |
- if ctx.Config[retryWaitKey] != "" { |
|
94 |
- rwd, err := time.ParseDuration(ctx.Config[retryWaitKey]) |
|
93 |
+ if info.Config[retryWaitKey] != "" { |
|
94 |
+ rwd, err := time.ParseDuration(info.Config[retryWaitKey]) |
|
95 | 95 |
if err != nil { |
96 | 96 |
return nil, err |
97 | 97 |
} |
... | ... |
@@ -99,8 +99,8 @@ func New(ctx logger.Context) (logger.Logger, error) { |
99 | 99 |
} |
100 | 100 |
|
101 | 101 |
maxRetries := defaultMaxRetries |
102 |
- if ctx.Config[maxRetriesKey] != "" { |
|
103 |
- mr64, err := strconv.ParseUint(ctx.Config[maxRetriesKey], 10, strconv.IntSize) |
|
102 |
+ if info.Config[maxRetriesKey] != "" { |
|
103 |
+ mr64, err := strconv.ParseUint(info.Config[maxRetriesKey], 10, strconv.IntSize) |
|
104 | 104 |
if err != nil { |
105 | 105 |
return nil, err |
106 | 106 |
} |
... | ... |
@@ -108,8 +108,8 @@ func New(ctx logger.Context) (logger.Logger, error) { |
108 | 108 |
} |
109 | 109 |
|
110 | 110 |
asyncConnect := false |
111 |
- if ctx.Config[asyncConnectKey] != "" { |
|
112 |
- if asyncConnect, err = strconv.ParseBool(ctx.Config[asyncConnectKey]); err != nil { |
|
111 |
+ if info.Config[asyncConnectKey] != "" { |
|
112 |
+ if asyncConnect, err = strconv.ParseBool(info.Config[asyncConnectKey]); err != nil { |
|
113 | 113 |
return nil, err |
114 | 114 |
} |
115 | 115 |
} |
... | ... |
@@ -125,7 +125,7 @@ func New(ctx logger.Context) (logger.Logger, error) { |
125 | 125 |
AsyncConnect: asyncConnect, |
126 | 126 |
} |
127 | 127 |
|
128 |
- logrus.WithField("container", ctx.ContainerID).WithField("config", fluentConfig). |
|
128 |
+ logrus.WithField("container", info.ContainerID).WithField("config", fluentConfig). |
|
129 | 129 |
Debug("logging driver fluentd configured") |
130 | 130 |
|
131 | 131 |
log, err := fluent.New(fluentConfig) |
... | ... |
@@ -134,8 +134,8 @@ func New(ctx logger.Context) (logger.Logger, error) { |
134 | 134 |
} |
135 | 135 |
return &fluentd{ |
136 | 136 |
tag: tag, |
137 |
- containerID: ctx.ContainerID, |
|
138 |
- containerName: ctx.ContainerName, |
|
137 |
+ containerID: info.ContainerID, |
|
138 |
+ containerName: info.ContainerName, |
|
139 | 139 |
writer: log, |
140 | 140 |
extra: extra, |
141 | 141 |
}, nil |
... | ... |
@@ -100,14 +100,14 @@ func initGCP() { |
100 | 100 |
// default credentials. |
101 | 101 |
// |
102 | 102 |
// See https://developers.google.com/identity/protocols/application-default-credentials |
103 |
-func New(ctx logger.Context) (logger.Logger, error) { |
|
103 |
+func New(info logger.Info) (logger.Logger, error) { |
|
104 | 104 |
initGCP() |
105 | 105 |
|
106 | 106 |
var project string |
107 | 107 |
if projectID != "" { |
108 | 108 |
project = projectID |
109 | 109 |
} |
110 |
- if projectID, found := ctx.Config[projectOptKey]; found { |
|
110 |
+ if projectID, found := info.Config[projectOptKey]; found { |
|
111 | 111 |
project = projectID |
112 | 112 |
} |
113 | 113 |
if project == "" { |
... | ... |
@@ -127,17 +127,17 @@ func New(ctx logger.Context) (logger.Logger, error) { |
127 | 127 |
l := &gcplogs{ |
128 | 128 |
logger: lg, |
129 | 129 |
container: &containerInfo{ |
130 |
- Name: ctx.ContainerName, |
|
131 |
- ID: ctx.ContainerID, |
|
132 |
- ImageName: ctx.ContainerImageName, |
|
133 |
- ImageID: ctx.ContainerImageID, |
|
134 |
- Created: ctx.ContainerCreated, |
|
135 |
- Metadata: ctx.ExtraAttributes(nil), |
|
130 |
+ Name: info.ContainerName, |
|
131 |
+ ID: info.ContainerID, |
|
132 |
+ ImageName: info.ContainerImageName, |
|
133 |
+ ImageID: info.ContainerImageID, |
|
134 |
+ Created: info.ContainerCreated, |
|
135 |
+ Metadata: info.ExtraAttributes(nil), |
|
136 | 136 |
}, |
137 | 137 |
} |
138 | 138 |
|
139 |
- if ctx.Config[logCmdKey] == "true" { |
|
140 |
- l.container.Command = ctx.Command() |
|
139 |
+ if info.Config[logCmdKey] == "true" { |
|
140 |
+ l.container.Command = info.Command() |
|
141 | 141 |
} |
142 | 142 |
|
143 | 143 |
if onGCE { |
... | ... |
@@ -146,11 +146,11 @@ func New(ctx logger.Context) (logger.Logger, error) { |
146 | 146 |
Name: instanceName, |
147 | 147 |
ID: instanceID, |
148 | 148 |
} |
149 |
- } else if ctx.Config[logZoneKey] != "" || ctx.Config[logNameKey] != "" || ctx.Config[logIDKey] != "" { |
|
149 |
+ } else if info.Config[logZoneKey] != "" || info.Config[logNameKey] != "" || info.Config[logIDKey] != "" { |
|
150 | 150 |
l.instance = &instanceInfo{ |
151 |
- Zone: ctx.Config[logZoneKey], |
|
152 |
- Name: ctx.Config[logNameKey], |
|
153 |
- ID: ctx.Config[logIDKey], |
|
151 |
+ Zone: info.Config[logZoneKey], |
|
152 |
+ Name: info.Config[logNameKey], |
|
153 |
+ ID: info.Config[logIDKey], |
|
154 | 154 |
} |
155 | 155 |
} |
156 | 156 |
|
... | ... |
@@ -24,7 +24,7 @@ const name = "gelf" |
24 | 24 |
|
25 | 25 |
type gelfLogger struct { |
26 | 26 |
writer *gelf.Writer |
27 |
- ctx logger.Context |
|
27 |
+ info logger.Info |
|
28 | 28 |
hostname string |
29 | 29 |
rawExtra json.RawMessage |
30 | 30 |
} |
... | ... |
@@ -40,36 +40,36 @@ func init() { |
40 | 40 |
|
41 | 41 |
// New creates a gelf logger using the configuration passed in on the |
42 | 42 |
// context. The supported context configuration variable is gelf-address. |
43 |
-func New(ctx logger.Context) (logger.Logger, error) { |
|
43 |
+func New(info logger.Info) (logger.Logger, error) { |
|
44 | 44 |
// parse gelf address |
45 |
- address, err := parseAddress(ctx.Config["gelf-address"]) |
|
45 |
+ address, err := parseAddress(info.Config["gelf-address"]) |
|
46 | 46 |
if err != nil { |
47 | 47 |
return nil, err |
48 | 48 |
} |
49 | 49 |
|
50 | 50 |
// collect extra data for GELF message |
51 |
- hostname, err := ctx.Hostname() |
|
51 |
+ hostname, err := info.Hostname() |
|
52 | 52 |
if err != nil { |
53 | 53 |
return nil, fmt.Errorf("gelf: cannot access hostname to set source field") |
54 | 54 |
} |
55 | 55 |
|
56 | 56 |
// parse log tag |
57 |
- tag, err := loggerutils.ParseLogTag(ctx, loggerutils.DefaultTemplate) |
|
57 |
+ tag, err := loggerutils.ParseLogTag(info, loggerutils.DefaultTemplate) |
|
58 | 58 |
if err != nil { |
59 | 59 |
return nil, err |
60 | 60 |
} |
61 | 61 |
|
62 | 62 |
extra := map[string]interface{}{ |
63 |
- "_container_id": ctx.ContainerID, |
|
64 |
- "_container_name": ctx.Name(), |
|
65 |
- "_image_id": ctx.ContainerImageID, |
|
66 |
- "_image_name": ctx.ContainerImageName, |
|
67 |
- "_command": ctx.Command(), |
|
63 |
+ "_container_id": info.ContainerID, |
|
64 |
+ "_container_name": info.Name(), |
|
65 |
+ "_image_id": info.ContainerImageID, |
|
66 |
+ "_image_name": info.ContainerImageName, |
|
67 |
+ "_command": info.Command(), |
|
68 | 68 |
"_tag": tag, |
69 |
- "_created": ctx.ContainerCreated, |
|
69 |
+ "_created": info.ContainerCreated, |
|
70 | 70 |
} |
71 | 71 |
|
72 |
- extraAttrs := ctx.ExtraAttributes(func(key string) string { |
|
72 |
+ extraAttrs := info.ExtraAttributes(func(key string) string { |
|
73 | 73 |
if key[0] == '_' { |
74 | 74 |
return key |
75 | 75 |
} |
... | ... |
@@ -90,7 +90,7 @@ func New(ctx logger.Context) (logger.Logger, error) { |
90 | 90 |
return nil, fmt.Errorf("gelf: cannot connect to GELF endpoint: %s %v", address, err) |
91 | 91 |
} |
92 | 92 |
|
93 |
- if v, ok := ctx.Config["gelf-compression-type"]; ok { |
|
93 |
+ if v, ok := info.Config["gelf-compression-type"]; ok { |
|
94 | 94 |
switch v { |
95 | 95 |
case "gzip": |
96 | 96 |
gelfWriter.CompressionType = gelf.CompressGzip |
... | ... |
@@ -103,7 +103,7 @@ func New(ctx logger.Context) (logger.Logger, error) { |
103 | 103 |
} |
104 | 104 |
} |
105 | 105 |
|
106 |
- if v, ok := ctx.Config["gelf-compression-level"]; ok { |
|
106 |
+ if v, ok := info.Config["gelf-compression-level"]; ok { |
|
107 | 107 |
val, err := strconv.Atoi(v) |
108 | 108 |
if err != nil { |
109 | 109 |
return nil, fmt.Errorf("gelf: invalid compression level %s, err %v", v, err) |
... | ... |
@@ -113,7 +113,7 @@ func New(ctx logger.Context) (logger.Logger, error) { |
113 | 113 |
|
114 | 114 |
return &gelfLogger{ |
115 | 115 |
writer: gelfWriter, |
116 |
- ctx: ctx, |
|
116 |
+ info: info, |
|
117 | 117 |
hostname: hostname, |
118 | 118 |
rawExtra: rawExtra, |
119 | 119 |
}, nil |
... | ... |
@@ -58,24 +58,24 @@ func sanitizeKeyMod(s string) string { |
58 | 58 |
|
59 | 59 |
// New creates a journald logger using the configuration passed in on |
60 | 60 |
// the context. |
61 |
-func New(ctx logger.Context) (logger.Logger, error) { |
|
61 |
+func New(info logger.Info) (logger.Logger, error) { |
|
62 | 62 |
if !journal.Enabled() { |
63 | 63 |
return nil, fmt.Errorf("journald is not enabled on this host") |
64 | 64 |
} |
65 | 65 |
|
66 | 66 |
// parse log tag |
67 |
- tag, err := loggerutils.ParseLogTag(ctx, loggerutils.DefaultTemplate) |
|
67 |
+ tag, err := loggerutils.ParseLogTag(info, loggerutils.DefaultTemplate) |
|
68 | 68 |
if err != nil { |
69 | 69 |
return nil, err |
70 | 70 |
} |
71 | 71 |
|
72 | 72 |
vars := map[string]string{ |
73 |
- "CONTAINER_ID": ctx.ContainerID[:12], |
|
74 |
- "CONTAINER_ID_FULL": ctx.ContainerID, |
|
75 |
- "CONTAINER_NAME": ctx.Name(), |
|
73 |
+ "CONTAINER_ID": info.ContainerID[:12], |
|
74 |
+ "CONTAINER_ID_FULL": info.ContainerID, |
|
75 |
+ "CONTAINER_NAME": info.Name(), |
|
76 | 76 |
"CONTAINER_TAG": tag, |
77 | 77 |
} |
78 |
- extraAttrs := ctx.ExtraAttributes(sanitizeKeyMod) |
|
78 |
+ extraAttrs := info.ExtraAttributes(sanitizeKeyMod) |
|
79 | 79 |
for k, v := range extraAttrs { |
80 | 80 |
vars[k] = v |
81 | 81 |
} |
... | ... |
@@ -40,9 +40,9 @@ func init() { |
40 | 40 |
|
41 | 41 |
// New creates new JSONFileLogger which writes to filename passed in |
42 | 42 |
// on given context. |
43 |
-func New(ctx logger.Context) (logger.Logger, error) { |
|
43 |
+func New(info logger.Info) (logger.Logger, error) { |
|
44 | 44 |
var capval int64 = -1 |
45 |
- if capacity, ok := ctx.Config["max-size"]; ok { |
|
45 |
+ if capacity, ok := info.Config["max-size"]; ok { |
|
46 | 46 |
var err error |
47 | 47 |
capval, err = units.FromHumanSize(capacity) |
48 | 48 |
if err != nil { |
... | ... |
@@ -50,7 +50,7 @@ func New(ctx logger.Context) (logger.Logger, error) { |
50 | 50 |
} |
51 | 51 |
} |
52 | 52 |
var maxFiles = 1 |
53 |
- if maxFileString, ok := ctx.Config["max-file"]; ok { |
|
53 |
+ if maxFileString, ok := info.Config["max-file"]; ok { |
|
54 | 54 |
var err error |
55 | 55 |
maxFiles, err = strconv.Atoi(maxFileString) |
56 | 56 |
if err != nil { |
... | ... |
@@ -61,13 +61,13 @@ func New(ctx logger.Context) (logger.Logger, error) { |
61 | 61 |
} |
62 | 62 |
} |
63 | 63 |
|
64 |
- writer, err := loggerutils.NewRotateFileWriter(ctx.LogPath, capval, maxFiles) |
|
64 |
+ writer, err := loggerutils.NewRotateFileWriter(info.LogPath, capval, maxFiles) |
|
65 | 65 |
if err != nil { |
66 | 66 |
return nil, err |
67 | 67 |
} |
68 | 68 |
|
69 | 69 |
var extra []byte |
70 |
- if attrs := ctx.ExtraAttributes(nil); len(attrs) > 0 { |
|
70 |
+ if attrs := info.ExtraAttributes(nil); len(attrs) > 0 { |
|
71 | 71 |
var err error |
72 | 72 |
extra, err = json.Marshal(attrs) |
73 | 73 |
if err != nil { |
... | ... |
@@ -22,7 +22,7 @@ func TestJSONFileLogger(t *testing.T) { |
22 | 22 |
} |
23 | 23 |
defer os.RemoveAll(tmp) |
24 | 24 |
filename := filepath.Join(tmp, "container.log") |
25 |
- l, err := New(logger.Context{ |
|
25 |
+ l, err := New(logger.Info{ |
|
26 | 26 |
ContainerID: cid, |
27 | 27 |
LogPath: filename, |
28 | 28 |
}) |
... | ... |
@@ -62,7 +62,7 @@ func BenchmarkJSONFileLogger(b *testing.B) { |
62 | 62 |
} |
63 | 63 |
defer os.RemoveAll(tmp) |
64 | 64 |
filename := filepath.Join(tmp, "container.log") |
65 |
- l, err := New(logger.Context{ |
|
65 |
+ l, err := New(logger.Info{ |
|
66 | 66 |
ContainerID: cid, |
67 | 67 |
LogPath: filename, |
68 | 68 |
}) |
... | ... |
@@ -97,7 +97,7 @@ func TestJSONFileLoggerWithOpts(t *testing.T) { |
97 | 97 |
defer os.RemoveAll(tmp) |
98 | 98 |
filename := filepath.Join(tmp, "container.log") |
99 | 99 |
config := map[string]string{"max-file": "2", "max-size": "1k"} |
100 |
- l, err := New(logger.Context{ |
|
100 |
+ l, err := New(logger.Info{ |
|
101 | 101 |
ContainerID: cid, |
102 | 102 |
LogPath: filename, |
103 | 103 |
Config: config, |
... | ... |
@@ -161,7 +161,7 @@ func TestJSONFileLoggerWithLabelsEnv(t *testing.T) { |
161 | 161 |
defer os.RemoveAll(tmp) |
162 | 162 |
filename := filepath.Join(tmp, "container.log") |
163 | 163 |
config := map[string]string{"labels": "rack,dc", "env": "environ,debug,ssl"} |
164 |
- l, err := New(logger.Context{ |
|
164 |
+ l, err := New(logger.Info{ |
|
165 | 165 |
ContainerID: cid, |
166 | 166 |
LogPath: filename, |
167 | 167 |
Config: config, |
... | ... |
@@ -210,7 +210,7 @@ func BenchmarkJSONFileLoggerWithReader(b *testing.B) { |
210 | 210 |
} |
211 | 211 |
defer os.RemoveAll(dir) |
212 | 212 |
|
213 |
- l, err := New(logger.Context{ |
|
213 |
+ l, err := New(logger.Info{ |
|
214 | 214 |
ContainerID: cid, |
215 | 215 |
LogPath: filepath.Join(dir, "container.log"), |
216 | 216 |
}) |
... | ... |
@@ -35,18 +35,18 @@ func init() { |
35 | 35 |
// New creates a logentries logger using the configuration passed in on |
36 | 36 |
// the context. The supported context configuration variable is |
37 | 37 |
// logentries-token. |
38 |
-func New(ctx logger.Context) (logger.Logger, error) { |
|
39 |
- logrus.WithField("container", ctx.ContainerID). |
|
40 |
- WithField("token", ctx.Config[token]). |
|
38 |
+func New(info logger.Info) (logger.Logger, error) { |
|
39 |
+ logrus.WithField("container", info.ContainerID). |
|
40 |
+ WithField("token", info.Config[token]). |
|
41 | 41 |
Debug("logging driver logentries configured") |
42 | 42 |
|
43 |
- log, err := le_go.Connect(ctx.Config[token]) |
|
43 |
+ log, err := le_go.Connect(info.Config[token]) |
|
44 | 44 |
if err != nil { |
45 | 45 |
return nil, err |
46 | 46 |
} |
47 | 47 |
return &logentries{ |
48 |
- containerID: ctx.ContainerID, |
|
49 |
- containerName: ctx.ContainerName, |
|
48 |
+ containerID: info.ContainerID, |
|
49 |
+ containerName: info.ContainerName, |
|
50 | 50 |
writer: log, |
51 | 51 |
}, nil |
52 | 52 |
} |
... | ... |
@@ -12,8 +12,8 @@ const DefaultTemplate = "{{.ID}}" |
12 | 12 |
|
13 | 13 |
// ParseLogTag generates a context aware tag for consistency across different |
14 | 14 |
// log drivers based on the context of the running container. |
15 |
-func ParseLogTag(ctx logger.Context, defaultTemplate string) (string, error) { |
|
16 |
- tagTemplate := ctx.Config["tag"] |
|
15 |
+func ParseLogTag(info logger.Info, defaultTemplate string) (string, error) { |
|
16 |
+ tagTemplate := info.Config["tag"] |
|
17 | 17 |
if tagTemplate == "" { |
18 | 18 |
tagTemplate = defaultTemplate |
19 | 19 |
} |
... | ... |
@@ -23,7 +23,7 @@ func ParseLogTag(ctx logger.Context, defaultTemplate string) (string, error) { |
23 | 23 |
return "", err |
24 | 24 |
} |
25 | 25 |
buf := new(bytes.Buffer) |
26 |
- if err := tmpl.Execute(buf, &ctx); err != nil { |
|
26 |
+ if err := tmpl.Execute(buf, &info); err != nil { |
|
27 | 27 |
return "", err |
28 | 28 |
} |
29 | 29 |
|
... | ... |
@@ -7,27 +7,27 @@ import ( |
7 | 7 |
) |
8 | 8 |
|
9 | 9 |
func TestParseLogTagDefaultTag(t *testing.T) { |
10 |
- ctx := buildContext(map[string]string{}) |
|
11 |
- tag, e := ParseLogTag(ctx, "{{.ID}}") |
|
12 |
- assertTag(t, e, tag, ctx.ID()) |
|
10 |
+ info := buildContext(map[string]string{}) |
|
11 |
+ tag, e := ParseLogTag(info, "{{.ID}}") |
|
12 |
+ assertTag(t, e, tag, info.ID()) |
|
13 | 13 |
} |
14 | 14 |
|
15 | 15 |
func TestParseLogTag(t *testing.T) { |
16 |
- ctx := buildContext(map[string]string{"tag": "{{.ImageName}}/{{.Name}}/{{.ID}}"}) |
|
17 |
- tag, e := ParseLogTag(ctx, "{{.ID}}") |
|
16 |
+ info := buildContext(map[string]string{"tag": "{{.ImageName}}/{{.Name}}/{{.ID}}"}) |
|
17 |
+ tag, e := ParseLogTag(info, "{{.ID}}") |
|
18 | 18 |
assertTag(t, e, tag, "test-image/test-container/container-ab") |
19 | 19 |
} |
20 | 20 |
|
21 | 21 |
func TestParseLogTagEmptyTag(t *testing.T) { |
22 |
- ctx := buildContext(map[string]string{}) |
|
23 |
- tag, e := ParseLogTag(ctx, "{{.DaemonName}}/{{.ID}}") |
|
22 |
+ info := buildContext(map[string]string{}) |
|
23 |
+ tag, e := ParseLogTag(info, "{{.DaemonName}}/{{.ID}}") |
|
24 | 24 |
assertTag(t, e, tag, "test-dockerd/container-ab") |
25 | 25 |
} |
26 | 26 |
|
27 | 27 |
// Helpers |
28 | 28 |
|
29 |
-func buildContext(cfg map[string]string) logger.Context { |
|
30 |
- return logger.Context{ |
|
29 |
+func buildContext(cfg map[string]string) logger.Info { |
|
30 |
+ return logger.Info{ |
|
31 | 31 |
ContainerID: "container-abcdefghijklmnopqrstuvwxyz01234567890", |
32 | 32 |
ContainerName: "/test-container", |
33 | 33 |
ContainerImageID: "image-abcdefghijklmnopqrstuvwxyz01234567890", |
34 | 34 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,111 @@ |
0 |
+package logger |
|
1 |
+ |
|
2 |
+import ( |
|
3 |
+ "fmt" |
|
4 |
+ "os" |
|
5 |
+ "strings" |
|
6 |
+ "time" |
|
7 |
+) |
|
8 |
+ |
|
9 |
+// Info provides enough information for a logging driver to do its function. |
|
10 |
+type Info struct { |
|
11 |
+ Config map[string]string |
|
12 |
+ ContainerID string |
|
13 |
+ ContainerName string |
|
14 |
+ ContainerEntrypoint string |
|
15 |
+ ContainerArgs []string |
|
16 |
+ ContainerImageID string |
|
17 |
+ ContainerImageName string |
|
18 |
+ ContainerCreated time.Time |
|
19 |
+ ContainerEnv []string |
|
20 |
+ ContainerLabels map[string]string |
|
21 |
+ LogPath string |
|
22 |
+ DaemonName string |
|
23 |
+} |
|
24 |
+ |
|
25 |
+// ExtraAttributes returns the user-defined extra attributes (labels, |
|
26 |
+// environment variables) in key-value format. This can be used by log drivers |
|
27 |
+// that support metadata to add more context to a log. |
|
28 |
+func (info *Info) ExtraAttributes(keyMod func(string) string) map[string]string { |
|
29 |
+ extra := make(map[string]string) |
|
30 |
+ labels, ok := info.Config["labels"] |
|
31 |
+ if ok && len(labels) > 0 { |
|
32 |
+ for _, l := range strings.Split(labels, ",") { |
|
33 |
+ if v, ok := info.ContainerLabels[l]; ok { |
|
34 |
+ if keyMod != nil { |
|
35 |
+ l = keyMod(l) |
|
36 |
+ } |
|
37 |
+ extra[l] = v |
|
38 |
+ } |
|
39 |
+ } |
|
40 |
+ } |
|
41 |
+ |
|
42 |
+ env, ok := info.Config["env"] |
|
43 |
+ if ok && len(env) > 0 { |
|
44 |
+ envMapping := make(map[string]string) |
|
45 |
+ for _, e := range info.ContainerEnv { |
|
46 |
+ if kv := strings.SplitN(e, "=", 2); len(kv) == 2 { |
|
47 |
+ envMapping[kv[0]] = kv[1] |
|
48 |
+ } |
|
49 |
+ } |
|
50 |
+ for _, l := range strings.Split(env, ",") { |
|
51 |
+ if v, ok := envMapping[l]; ok { |
|
52 |
+ if keyMod != nil { |
|
53 |
+ l = keyMod(l) |
|
54 |
+ } |
|
55 |
+ extra[l] = v |
|
56 |
+ } |
|
57 |
+ } |
|
58 |
+ } |
|
59 |
+ |
|
60 |
+ return extra |
|
61 |
+} |
|
62 |
+ |
|
63 |
+// Hostname returns the hostname from the underlying OS. |
|
64 |
+func (info *Info) Hostname() (string, error) { |
|
65 |
+ hostname, err := os.Hostname() |
|
66 |
+ if err != nil { |
|
67 |
+ return "", fmt.Errorf("logger: can not resolve hostname: %v", err) |
|
68 |
+ } |
|
69 |
+ return hostname, nil |
|
70 |
+} |
|
71 |
+ |
|
72 |
+// Command returns the command that the container being logged was |
|
73 |
+// started with. The Entrypoint is prepended to the container |
|
74 |
+// arguments. |
|
75 |
+func (info *Info) Command() string { |
|
76 |
+ terms := []string{info.ContainerEntrypoint} |
|
77 |
+ terms = append(terms, info.ContainerArgs...) |
|
78 |
+ command := strings.Join(terms, " ") |
|
79 |
+ return command |
|
80 |
+} |
|
81 |
+ |
|
82 |
+// ID Returns the Container ID shortened to 12 characters. |
|
83 |
+func (info *Info) ID() string { |
|
84 |
+ return info.ContainerID[:12] |
|
85 |
+} |
|
86 |
+ |
|
87 |
+// FullID is an alias of ContainerID. |
|
88 |
+func (info *Info) FullID() string { |
|
89 |
+ return info.ContainerID |
|
90 |
+} |
|
91 |
+ |
|
92 |
+// Name returns the ContainerName without a preceding '/'. |
|
93 |
+func (info *Info) Name() string { |
|
94 |
+ return strings.TrimPrefix(info.ContainerName, "/") |
|
95 |
+} |
|
96 |
+ |
|
97 |
+// ImageID returns the ContainerImageID shortened to 12 characters. |
|
98 |
+func (info *Info) ImageID() string { |
|
99 |
+ return info.ContainerImageID[:12] |
|
100 |
+} |
|
101 |
+ |
|
102 |
+// ImageFullID is an alias of ContainerImageID. |
|
103 |
+func (info *Info) ImageFullID() string { |
|
104 |
+ return info.ContainerImageID |
|
105 |
+} |
|
106 |
+ |
|
107 |
+// ImageName is an alias of ContainerImageName |
|
108 |
+func (info *Info) ImageName() string { |
|
109 |
+ return info.ContainerImageName |
|
110 |
+} |
... | ... |
@@ -140,20 +140,20 @@ func init() { |
140 | 140 |
} |
141 | 141 |
|
142 | 142 |
// New creates splunk logger driver using configuration passed in context |
143 |
-func New(ctx logger.Context) (logger.Logger, error) { |
|
144 |
- hostname, err := ctx.Hostname() |
|
143 |
+func New(info logger.Info) (logger.Logger, error) { |
|
144 |
+ hostname, err := info.Hostname() |
|
145 | 145 |
if err != nil { |
146 | 146 |
return nil, fmt.Errorf("%s: cannot access hostname to set source field", driverName) |
147 | 147 |
} |
148 | 148 |
|
149 | 149 |
// Parse and validate Splunk URL |
150 |
- splunkURL, err := parseURL(ctx) |
|
150 |
+ splunkURL, err := parseURL(info) |
|
151 | 151 |
if err != nil { |
152 | 152 |
return nil, err |
153 | 153 |
} |
154 | 154 |
|
155 | 155 |
// Splunk Token is required parameter |
156 |
- splunkToken, ok := ctx.Config[splunkTokenKey] |
|
156 |
+ splunkToken, ok := info.Config[splunkTokenKey] |
|
157 | 157 |
if !ok { |
158 | 158 |
return nil, fmt.Errorf("%s: %s is expected", driverName, splunkTokenKey) |
159 | 159 |
} |
... | ... |
@@ -162,7 +162,7 @@ func New(ctx logger.Context) (logger.Logger, error) { |
162 | 162 |
|
163 | 163 |
// Splunk is using autogenerated certificates by default, |
164 | 164 |
// allow users to trust them with skipping verification |
165 |
- if insecureSkipVerifyStr, ok := ctx.Config[splunkInsecureSkipVerifyKey]; ok { |
|
165 |
+ if insecureSkipVerifyStr, ok := info.Config[splunkInsecureSkipVerifyKey]; ok { |
|
166 | 166 |
insecureSkipVerify, err := strconv.ParseBool(insecureSkipVerifyStr) |
167 | 167 |
if err != nil { |
168 | 168 |
return nil, err |
... | ... |
@@ -171,7 +171,7 @@ func New(ctx logger.Context) (logger.Logger, error) { |
171 | 171 |
} |
172 | 172 |
|
173 | 173 |
// If path to the root certificate is provided - load it |
174 |
- if caPath, ok := ctx.Config[splunkCAPathKey]; ok { |
|
174 |
+ if caPath, ok := info.Config[splunkCAPathKey]; ok { |
|
175 | 175 |
caCert, err := ioutil.ReadFile(caPath) |
176 | 176 |
if err != nil { |
177 | 177 |
return nil, err |
... | ... |
@@ -181,12 +181,12 @@ func New(ctx logger.Context) (logger.Logger, error) { |
181 | 181 |
tlsConfig.RootCAs = caPool |
182 | 182 |
} |
183 | 183 |
|
184 |
- if caName, ok := ctx.Config[splunkCANameKey]; ok { |
|
184 |
+ if caName, ok := info.Config[splunkCANameKey]; ok { |
|
185 | 185 |
tlsConfig.ServerName = caName |
186 | 186 |
} |
187 | 187 |
|
188 | 188 |
gzipCompression := false |
189 |
- if gzipCompressionStr, ok := ctx.Config[splunkGzipCompressionKey]; ok { |
|
189 |
+ if gzipCompressionStr, ok := info.Config[splunkGzipCompressionKey]; ok { |
|
190 | 190 |
gzipCompression, err = strconv.ParseBool(gzipCompressionStr) |
191 | 191 |
if err != nil { |
192 | 192 |
return nil, err |
... | ... |
@@ -194,7 +194,7 @@ func New(ctx logger.Context) (logger.Logger, error) { |
194 | 194 |
} |
195 | 195 |
|
196 | 196 |
gzipCompressionLevel := gzip.DefaultCompression |
197 |
- if gzipCompressionLevelStr, ok := ctx.Config[splunkGzipCompressionLevelKey]; ok { |
|
197 |
+ if gzipCompressionLevelStr, ok := info.Config[splunkGzipCompressionLevelKey]; ok { |
|
198 | 198 |
var err error |
199 | 199 |
gzipCompressionLevel64, err := strconv.ParseInt(gzipCompressionLevelStr, 10, 32) |
200 | 200 |
if err != nil { |
... | ... |
@@ -215,9 +215,9 @@ func New(ctx logger.Context) (logger.Logger, error) { |
215 | 215 |
Transport: transport, |
216 | 216 |
} |
217 | 217 |
|
218 |
- source := ctx.Config[splunkSourceKey] |
|
219 |
- sourceType := ctx.Config[splunkSourceTypeKey] |
|
220 |
- index := ctx.Config[splunkIndexKey] |
|
218 |
+ source := info.Config[splunkSourceKey] |
|
219 |
+ sourceType := info.Config[splunkSourceTypeKey] |
|
220 |
+ index := info.Config[splunkIndexKey] |
|
221 | 221 |
|
222 | 222 |
var nullMessage = &splunkMessage{ |
223 | 223 |
Host: hostname, |
... | ... |
@@ -228,14 +228,14 @@ func New(ctx logger.Context) (logger.Logger, error) { |
228 | 228 |
|
229 | 229 |
// Allow user to remove tag from the messages by setting tag to empty string |
230 | 230 |
tag := "" |
231 |
- if tagTemplate, ok := ctx.Config[tagKey]; !ok || tagTemplate != "" { |
|
232 |
- tag, err = loggerutils.ParseLogTag(ctx, loggerutils.DefaultTemplate) |
|
231 |
+ if tagTemplate, ok := info.Config[tagKey]; !ok || tagTemplate != "" { |
|
232 |
+ tag, err = loggerutils.ParseLogTag(info, loggerutils.DefaultTemplate) |
|
233 | 233 |
if err != nil { |
234 | 234 |
return nil, err |
235 | 235 |
} |
236 | 236 |
} |
237 | 237 |
|
238 |
- attrs := ctx.ExtraAttributes(nil) |
|
238 |
+ attrs := info.ExtraAttributes(nil) |
|
239 | 239 |
|
240 | 240 |
var ( |
241 | 241 |
postMessagesFrequency = getAdvancedOptionDuration(envVarPostMessagesFrequency, defaultPostMessagesFrequency) |
... | ... |
@@ -260,7 +260,7 @@ func New(ctx logger.Context) (logger.Logger, error) { |
260 | 260 |
|
261 | 261 |
// By default we verify connection, but we allow use to skip that |
262 | 262 |
verifyConnection := true |
263 |
- if verifyConnectionStr, ok := ctx.Config[splunkVerifyConnectionKey]; ok { |
|
263 |
+ if verifyConnectionStr, ok := info.Config[splunkVerifyConnectionKey]; ok { |
|
264 | 264 |
var err error |
265 | 265 |
verifyConnection, err = strconv.ParseBool(verifyConnectionStr) |
266 | 266 |
if err != nil { |
... | ... |
@@ -275,7 +275,7 @@ func New(ctx logger.Context) (logger.Logger, error) { |
275 | 275 |
} |
276 | 276 |
|
277 | 277 |
var splunkFormat string |
278 |
- if splunkFormatParsed, ok := ctx.Config[splunkFormatKey]; ok { |
|
278 |
+ if splunkFormatParsed, ok := info.Config[splunkFormatKey]; ok { |
|
279 | 279 |
switch splunkFormatParsed { |
280 | 280 |
case splunkFormatInline: |
281 | 281 |
case splunkFormatJSON: |
... | ... |
@@ -547,8 +547,8 @@ func ValidateLogOpt(cfg map[string]string) error { |
547 | 547 |
return nil |
548 | 548 |
} |
549 | 549 |
|
550 |
-func parseURL(ctx logger.Context) (*url.URL, error) { |
|
551 |
- splunkURLStr, ok := ctx.Config[splunkURLKey] |
|
550 |
+func parseURL(info logger.Info) (*url.URL, error) { |
|
551 |
+ splunkURLStr, ok := info.Config[splunkURLKey] |
|
552 | 552 |
if !ok { |
553 | 553 |
return nil, fmt.Errorf("%s: %s is expected", driverName, splunkURLKey) |
554 | 554 |
} |
... | ... |
@@ -43,10 +43,10 @@ func TestValidateLogOpt(t *testing.T) { |
43 | 43 |
|
44 | 44 |
// Driver require user to specify required options |
45 | 45 |
func TestNewMissedConfig(t *testing.T) { |
46 |
- ctx := logger.Context{ |
|
46 |
+ info := logger.Info{ |
|
47 | 47 |
Config: map[string]string{}, |
48 | 48 |
} |
49 |
- _, err := New(ctx) |
|
49 |
+ _, err := New(info) |
|
50 | 50 |
if err == nil { |
51 | 51 |
t.Fatal("Logger driver should fail when no required parameters specified") |
52 | 52 |
} |
... | ... |
@@ -54,12 +54,12 @@ func TestNewMissedConfig(t *testing.T) { |
54 | 54 |
|
55 | 55 |
// Driver require user to specify splunk-url |
56 | 56 |
func TestNewMissedUrl(t *testing.T) { |
57 |
- ctx := logger.Context{ |
|
57 |
+ info := logger.Info{ |
|
58 | 58 |
Config: map[string]string{ |
59 | 59 |
splunkTokenKey: "4642492F-D8BD-47F1-A005-0C08AE4657DF", |
60 | 60 |
}, |
61 | 61 |
} |
62 |
- _, err := New(ctx) |
|
62 |
+ _, err := New(info) |
|
63 | 63 |
if err.Error() != "splunk: splunk-url is expected" { |
64 | 64 |
t.Fatal("Logger driver should fail when no required parameters specified") |
65 | 65 |
} |
... | ... |
@@ -67,12 +67,12 @@ func TestNewMissedUrl(t *testing.T) { |
67 | 67 |
|
68 | 68 |
// Driver require user to specify splunk-token |
69 | 69 |
func TestNewMissedToken(t *testing.T) { |
70 |
- ctx := logger.Context{ |
|
70 |
+ info := logger.Info{ |
|
71 | 71 |
Config: map[string]string{ |
72 | 72 |
splunkURLKey: "http://127.0.0.1:8088", |
73 | 73 |
}, |
74 | 74 |
} |
75 |
- _, err := New(ctx) |
|
75 |
+ _, err := New(info) |
|
76 | 76 |
if err.Error() != "splunk: splunk-token is expected" { |
77 | 77 |
t.Fatal("Logger driver should fail when no required parameters specified") |
78 | 78 |
} |
... | ... |
@@ -84,7 +84,7 @@ func TestDefault(t *testing.T) { |
84 | 84 |
|
85 | 85 |
go hec.Serve() |
86 | 86 |
|
87 |
- ctx := logger.Context{ |
|
87 |
+ info := logger.Info{ |
|
88 | 88 |
Config: map[string]string{ |
89 | 89 |
splunkURLKey: hec.URL(), |
90 | 90 |
splunkTokenKey: hec.token, |
... | ... |
@@ -95,12 +95,12 @@ func TestDefault(t *testing.T) { |
95 | 95 |
ContainerImageName: "container_image_name", |
96 | 96 |
} |
97 | 97 |
|
98 |
- hostname, err := ctx.Hostname() |
|
98 |
+ hostname, err := info.Hostname() |
|
99 | 99 |
if err != nil { |
100 | 100 |
t.Fatal(err) |
101 | 101 |
} |
102 | 102 |
|
103 |
- loggerDriver, err := New(ctx) |
|
103 |
+ loggerDriver, err := New(info) |
|
104 | 104 |
if err != nil { |
105 | 105 |
t.Fatal(err) |
106 | 106 |
} |
... | ... |
@@ -206,7 +206,7 @@ func TestInlineFormatWithNonDefaultOptions(t *testing.T) { |
206 | 206 |
|
207 | 207 |
go hec.Serve() |
208 | 208 |
|
209 |
- ctx := logger.Context{ |
|
209 |
+ info := logger.Info{ |
|
210 | 210 |
Config: map[string]string{ |
211 | 211 |
splunkURLKey: hec.URL(), |
212 | 212 |
splunkTokenKey: hec.token, |
... | ... |
@@ -227,12 +227,12 @@ func TestInlineFormatWithNonDefaultOptions(t *testing.T) { |
227 | 227 |
}, |
228 | 228 |
} |
229 | 229 |
|
230 |
- hostname, err := ctx.Hostname() |
|
230 |
+ hostname, err := info.Hostname() |
|
231 | 231 |
if err != nil { |
232 | 232 |
t.Fatal(err) |
233 | 233 |
} |
234 | 234 |
|
235 |
- loggerDriver, err := New(ctx) |
|
235 |
+ loggerDriver, err := New(info) |
|
236 | 236 |
if err != nil { |
237 | 237 |
t.Fatal(err) |
238 | 238 |
} |
... | ... |
@@ -312,7 +312,7 @@ func TestJsonFormat(t *testing.T) { |
312 | 312 |
|
313 | 313 |
go hec.Serve() |
314 | 314 |
|
315 |
- ctx := logger.Context{ |
|
315 |
+ info := logger.Info{ |
|
316 | 316 |
Config: map[string]string{ |
317 | 317 |
splunkURLKey: hec.URL(), |
318 | 318 |
splunkTokenKey: hec.token, |
... | ... |
@@ -326,12 +326,12 @@ func TestJsonFormat(t *testing.T) { |
326 | 326 |
ContainerImageName: "container_image_name", |
327 | 327 |
} |
328 | 328 |
|
329 |
- hostname, err := ctx.Hostname() |
|
329 |
+ hostname, err := info.Hostname() |
|
330 | 330 |
if err != nil { |
331 | 331 |
t.Fatal(err) |
332 | 332 |
} |
333 | 333 |
|
334 |
- loggerDriver, err := New(ctx) |
|
334 |
+ loggerDriver, err := New(info) |
|
335 | 335 |
if err != nil { |
336 | 336 |
t.Fatal(err) |
337 | 337 |
} |
... | ... |
@@ -431,7 +431,7 @@ func TestRawFormat(t *testing.T) { |
431 | 431 |
|
432 | 432 |
go hec.Serve() |
433 | 433 |
|
434 |
- ctx := logger.Context{ |
|
434 |
+ info := logger.Info{ |
|
435 | 435 |
Config: map[string]string{ |
436 | 436 |
splunkURLKey: hec.URL(), |
437 | 437 |
splunkTokenKey: hec.token, |
... | ... |
@@ -443,12 +443,12 @@ func TestRawFormat(t *testing.T) { |
443 | 443 |
ContainerImageName: "container_image_name", |
444 | 444 |
} |
445 | 445 |
|
446 |
- hostname, err := ctx.Hostname() |
|
446 |
+ hostname, err := info.Hostname() |
|
447 | 447 |
if err != nil { |
448 | 448 |
t.Fatal(err) |
449 | 449 |
} |
450 | 450 |
|
451 |
- loggerDriver, err := New(ctx) |
|
451 |
+ loggerDriver, err := New(info) |
|
452 | 452 |
if err != nil { |
453 | 453 |
t.Fatal(err) |
454 | 454 |
} |
... | ... |
@@ -541,7 +541,7 @@ func TestRawFormatWithLabels(t *testing.T) { |
541 | 541 |
|
542 | 542 |
go hec.Serve() |
543 | 543 |
|
544 |
- ctx := logger.Context{ |
|
544 |
+ info := logger.Info{ |
|
545 | 545 |
Config: map[string]string{ |
546 | 546 |
splunkURLKey: hec.URL(), |
547 | 547 |
splunkTokenKey: hec.token, |
... | ... |
@@ -557,12 +557,12 @@ func TestRawFormatWithLabels(t *testing.T) { |
557 | 557 |
}, |
558 | 558 |
} |
559 | 559 |
|
560 |
- hostname, err := ctx.Hostname() |
|
560 |
+ hostname, err := info.Hostname() |
|
561 | 561 |
if err != nil { |
562 | 562 |
t.Fatal(err) |
563 | 563 |
} |
564 | 564 |
|
565 |
- loggerDriver, err := New(ctx) |
|
565 |
+ loggerDriver, err := New(info) |
|
566 | 566 |
if err != nil { |
567 | 567 |
t.Fatal(err) |
568 | 568 |
} |
... | ... |
@@ -656,7 +656,7 @@ func TestRawFormatWithoutTag(t *testing.T) { |
656 | 656 |
|
657 | 657 |
go hec.Serve() |
658 | 658 |
|
659 |
- ctx := logger.Context{ |
|
659 |
+ info := logger.Info{ |
|
660 | 660 |
Config: map[string]string{ |
661 | 661 |
splunkURLKey: hec.URL(), |
662 | 662 |
splunkTokenKey: hec.token, |
... | ... |
@@ -669,12 +669,12 @@ func TestRawFormatWithoutTag(t *testing.T) { |
669 | 669 |
ContainerImageName: "container_image_name", |
670 | 670 |
} |
671 | 671 |
|
672 |
- hostname, err := ctx.Hostname() |
|
672 |
+ hostname, err := info.Hostname() |
|
673 | 673 |
if err != nil { |
674 | 674 |
t.Fatal(err) |
675 | 675 |
} |
676 | 676 |
|
677 |
- loggerDriver, err := New(ctx) |
|
677 |
+ loggerDriver, err := New(info) |
|
678 | 678 |
if err != nil { |
679 | 679 |
t.Fatal(err) |
680 | 680 |
} |
... | ... |
@@ -773,7 +773,7 @@ func TestBatching(t *testing.T) { |
773 | 773 |
|
774 | 774 |
go hec.Serve() |
775 | 775 |
|
776 |
- ctx := logger.Context{ |
|
776 |
+ info := logger.Info{ |
|
777 | 777 |
Config: map[string]string{ |
778 | 778 |
splunkURLKey: hec.URL(), |
779 | 779 |
splunkTokenKey: hec.token, |
... | ... |
@@ -784,7 +784,7 @@ func TestBatching(t *testing.T) { |
784 | 784 |
ContainerImageName: "container_image_name", |
785 | 785 |
} |
786 | 786 |
|
787 |
- loggerDriver, err := New(ctx) |
|
787 |
+ loggerDriver, err := New(info) |
|
788 | 788 |
if err != nil { |
789 | 789 |
t.Fatal(err) |
790 | 790 |
} |
... | ... |
@@ -839,7 +839,7 @@ func TestFrequency(t *testing.T) { |
839 | 839 |
|
840 | 840 |
go hec.Serve() |
841 | 841 |
|
842 |
- ctx := logger.Context{ |
|
842 |
+ info := logger.Info{ |
|
843 | 843 |
Config: map[string]string{ |
844 | 844 |
splunkURLKey: hec.URL(), |
845 | 845 |
splunkTokenKey: hec.token, |
... | ... |
@@ -850,7 +850,7 @@ func TestFrequency(t *testing.T) { |
850 | 850 |
ContainerImageName: "container_image_name", |
851 | 851 |
} |
852 | 852 |
|
853 |
- loggerDriver, err := New(ctx) |
|
853 |
+ loggerDriver, err := New(info) |
|
854 | 854 |
if err != nil { |
855 | 855 |
t.Fatal(err) |
856 | 856 |
} |
... | ... |
@@ -920,7 +920,7 @@ func TestOneMessagePerRequest(t *testing.T) { |
920 | 920 |
|
921 | 921 |
go hec.Serve() |
922 | 922 |
|
923 |
- ctx := logger.Context{ |
|
923 |
+ info := logger.Info{ |
|
924 | 924 |
Config: map[string]string{ |
925 | 925 |
splunkURLKey: hec.URL(), |
926 | 926 |
splunkTokenKey: hec.token, |
... | ... |
@@ -931,7 +931,7 @@ func TestOneMessagePerRequest(t *testing.T) { |
931 | 931 |
ContainerImageName: "container_image_name", |
932 | 932 |
} |
933 | 933 |
|
934 |
- loggerDriver, err := New(ctx) |
|
934 |
+ loggerDriver, err := New(info) |
|
935 | 935 |
if err != nil { |
936 | 936 |
t.Fatal(err) |
937 | 937 |
} |
... | ... |
@@ -994,7 +994,7 @@ func TestVerify(t *testing.T) { |
994 | 994 |
hec.simulateServerError = true |
995 | 995 |
go hec.Serve() |
996 | 996 |
|
997 |
- ctx := logger.Context{ |
|
997 |
+ info := logger.Info{ |
|
998 | 998 |
Config: map[string]string{ |
999 | 999 |
splunkURLKey: hec.URL(), |
1000 | 1000 |
splunkTokenKey: hec.token, |
... | ... |
@@ -1005,7 +1005,7 @@ func TestVerify(t *testing.T) { |
1005 | 1005 |
ContainerImageName: "container_image_name", |
1006 | 1006 |
} |
1007 | 1007 |
|
1008 |
- _, err := New(ctx) |
|
1008 |
+ _, err := New(info) |
|
1009 | 1009 |
if err == nil { |
1010 | 1010 |
t.Fatal("Expecting driver to fail, when server is unresponsive") |
1011 | 1011 |
} |
... | ... |
@@ -1023,7 +1023,7 @@ func TestSkipVerify(t *testing.T) { |
1023 | 1023 |
hec.simulateServerError = true |
1024 | 1024 |
go hec.Serve() |
1025 | 1025 |
|
1026 |
- ctx := logger.Context{ |
|
1026 |
+ info := logger.Info{ |
|
1027 | 1027 |
Config: map[string]string{ |
1028 | 1028 |
splunkURLKey: hec.URL(), |
1029 | 1029 |
splunkTokenKey: hec.token, |
... | ... |
@@ -1035,7 +1035,7 @@ func TestSkipVerify(t *testing.T) { |
1035 | 1035 |
ContainerImageName: "container_image_name", |
1036 | 1036 |
} |
1037 | 1037 |
|
1038 |
- loggerDriver, err := New(ctx) |
|
1038 |
+ loggerDriver, err := New(info) |
|
1039 | 1039 |
if err != nil { |
1040 | 1040 |
t.Fatal(err) |
1041 | 1041 |
} |
... | ... |
@@ -1105,7 +1105,7 @@ func TestBufferMaximum(t *testing.T) { |
1105 | 1105 |
hec.simulateServerError = true |
1106 | 1106 |
go hec.Serve() |
1107 | 1107 |
|
1108 |
- ctx := logger.Context{ |
|
1108 |
+ info := logger.Info{ |
|
1109 | 1109 |
Config: map[string]string{ |
1110 | 1110 |
splunkURLKey: hec.URL(), |
1111 | 1111 |
splunkTokenKey: hec.token, |
... | ... |
@@ -1117,7 +1117,7 @@ func TestBufferMaximum(t *testing.T) { |
1117 | 1117 |
ContainerImageName: "container_image_name", |
1118 | 1118 |
} |
1119 | 1119 |
|
1120 |
- loggerDriver, err := New(ctx) |
|
1120 |
+ loggerDriver, err := New(info) |
|
1121 | 1121 |
if err != nil { |
1122 | 1122 |
t.Fatal(err) |
1123 | 1123 |
} |
... | ... |
@@ -1194,7 +1194,7 @@ func TestServerAlwaysDown(t *testing.T) { |
1194 | 1194 |
hec.simulateServerError = true |
1195 | 1195 |
go hec.Serve() |
1196 | 1196 |
|
1197 |
- ctx := logger.Context{ |
|
1197 |
+ info := logger.Info{ |
|
1198 | 1198 |
Config: map[string]string{ |
1199 | 1199 |
splunkURLKey: hec.URL(), |
1200 | 1200 |
splunkTokenKey: hec.token, |
... | ... |
@@ -1206,7 +1206,7 @@ func TestServerAlwaysDown(t *testing.T) { |
1206 | 1206 |
ContainerImageName: "container_image_name", |
1207 | 1207 |
} |
1208 | 1208 |
|
1209 |
- loggerDriver, err := New(ctx) |
|
1209 |
+ loggerDriver, err := New(info) |
|
1210 | 1210 |
if err != nil { |
1211 | 1211 |
t.Fatal(err) |
1212 | 1212 |
} |
... | ... |
@@ -1253,7 +1253,7 @@ func TestCannotSendAfterClose(t *testing.T) { |
1253 | 1253 |
hec := NewHTTPEventCollectorMock(t) |
1254 | 1254 |
go hec.Serve() |
1255 | 1255 |
|
1256 |
- ctx := logger.Context{ |
|
1256 |
+ info := logger.Info{ |
|
1257 | 1257 |
Config: map[string]string{ |
1258 | 1258 |
splunkURLKey: hec.URL(), |
1259 | 1259 |
splunkTokenKey: hec.token, |
... | ... |
@@ -1264,7 +1264,7 @@ func TestCannotSendAfterClose(t *testing.T) { |
1264 | 1264 |
ContainerImageName: "container_image_name", |
1265 | 1265 |
} |
1266 | 1266 |
|
1267 |
- loggerDriver, err := New(ctx) |
|
1267 |
+ loggerDriver, err := New(info) |
|
1268 | 1268 |
if err != nil { |
1269 | 1269 |
t.Fatal(err) |
1270 | 1270 |
} |
... | ... |
@@ -87,30 +87,30 @@ func rfc5424microformatterWithAppNameAsTag(p syslog.Priority, hostname, tag, con |
87 | 87 |
// New creates a syslog logger using the configuration passed in on |
88 | 88 |
// the context. Supported context configuration variables are |
89 | 89 |
// syslog-address, syslog-facility, syslog-format. |
90 |
-func New(ctx logger.Context) (logger.Logger, error) { |
|
91 |
- tag, err := loggerutils.ParseLogTag(ctx, loggerutils.DefaultTemplate) |
|
90 |
+func New(info logger.Info) (logger.Logger, error) { |
|
91 |
+ tag, err := loggerutils.ParseLogTag(info, loggerutils.DefaultTemplate) |
|
92 | 92 |
if err != nil { |
93 | 93 |
return nil, err |
94 | 94 |
} |
95 | 95 |
|
96 |
- proto, address, err := parseAddress(ctx.Config["syslog-address"]) |
|
96 |
+ proto, address, err := parseAddress(info.Config["syslog-address"]) |
|
97 | 97 |
if err != nil { |
98 | 98 |
return nil, err |
99 | 99 |
} |
100 | 100 |
|
101 |
- facility, err := parseFacility(ctx.Config["syslog-facility"]) |
|
101 |
+ facility, err := parseFacility(info.Config["syslog-facility"]) |
|
102 | 102 |
if err != nil { |
103 | 103 |
return nil, err |
104 | 104 |
} |
105 | 105 |
|
106 |
- syslogFormatter, syslogFramer, err := parseLogFormat(ctx.Config["syslog-format"], proto) |
|
106 |
+ syslogFormatter, syslogFramer, err := parseLogFormat(info.Config["syslog-format"], proto) |
|
107 | 107 |
if err != nil { |
108 | 108 |
return nil, err |
109 | 109 |
} |
110 | 110 |
|
111 | 111 |
var log *syslog.Writer |
112 | 112 |
if proto == secureProto { |
113 |
- tlsConfig, tlsErr := parseTLSConfig(ctx.Config) |
|
113 |
+ tlsConfig, tlsErr := parseTLSConfig(info.Config) |
|
114 | 114 |
if tlsErr != nil { |
115 | 115 |
return nil, tlsErr |
116 | 116 |
} |