mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
38c49d9987
This fix tries to address the issue raised in #22358 where syslog's message tag always starts with `docker/` and can not be removed by changing the log tag templates. The issue is that syslog driver hardcodes `path.Base(os.Args[0])` as the prefix, which is the binary file name of the daemon (`dockerd`). This could be an issue for certain situations (e.g., #22358) where user may prefer not to have a dedicated prefix in syslog messages. There is no way to override this behavior in the current verison of the docker. This fix tries to address this issue without making changes in the default behavior of the syslog driver. An additional `{{.DaemonName}}` has been introduced in the syslog tag. This is assigned as the `docker` when daemon starts. The default log tag template has also been changed from `path.Base(os.Args[0]) + "/{{.ID}}"` to `{{.DaemonName}}/{{.ID}}`. Therefore, there is no behavior changes when log-tag is not provided. In order to be consistent, the default log tag for fluentd has been changed from `docker.{{.ID}}` to `{{DaemonName}}.{{.ID}}` as well. The documentation for log-tag has been updated to reflect this change. Additional test cases have been added to cover changes in this fix. This fix fixes #22358. Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
113 lines
2.8 KiB
Go
113 lines
2.8 KiB
Go
package logger
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// Context provides enough information for a logging driver to do its function.
|
|
type Context struct {
|
|
Config map[string]string
|
|
ContainerID string
|
|
ContainerName string
|
|
ContainerEntrypoint string
|
|
ContainerArgs []string
|
|
ContainerImageID string
|
|
ContainerImageName string
|
|
ContainerCreated time.Time
|
|
ContainerEnv []string
|
|
ContainerLabels map[string]string
|
|
LogPath string
|
|
DaemonName string
|
|
}
|
|
|
|
// ExtraAttributes returns the user-defined extra attributes (labels,
|
|
// environment variables) in key-value format. This can be used by log drivers
|
|
// that support metadata to add more context to a log.
|
|
func (ctx *Context) ExtraAttributes(keyMod func(string) string) map[string]string {
|
|
extra := make(map[string]string)
|
|
labels, ok := ctx.Config["labels"]
|
|
if ok && len(labels) > 0 {
|
|
for _, l := range strings.Split(labels, ",") {
|
|
if v, ok := ctx.ContainerLabels[l]; ok {
|
|
if keyMod != nil {
|
|
l = keyMod(l)
|
|
}
|
|
extra[l] = v
|
|
}
|
|
}
|
|
}
|
|
|
|
env, ok := ctx.Config["env"]
|
|
if ok && len(env) > 0 {
|
|
envMapping := make(map[string]string)
|
|
for _, e := range ctx.ContainerEnv {
|
|
if kv := strings.SplitN(e, "=", 2); len(kv) == 2 {
|
|
envMapping[kv[0]] = kv[1]
|
|
}
|
|
}
|
|
for _, l := range strings.Split(env, ",") {
|
|
if v, ok := envMapping[l]; ok {
|
|
if keyMod != nil {
|
|
l = keyMod(l)
|
|
}
|
|
extra[l] = v
|
|
}
|
|
}
|
|
}
|
|
|
|
return extra
|
|
}
|
|
|
|
// Hostname returns the hostname from the underlying OS.
|
|
func (ctx *Context) Hostname() (string, error) {
|
|
hostname, err := os.Hostname()
|
|
if err != nil {
|
|
return "", fmt.Errorf("logger: can not resolve hostname: %v", err)
|
|
}
|
|
return hostname, nil
|
|
}
|
|
|
|
// Command returns the command that the container being logged was
|
|
// started with. The Entrypoint is prepended to the container
|
|
// arguments.
|
|
func (ctx *Context) Command() string {
|
|
terms := []string{ctx.ContainerEntrypoint}
|
|
for _, arg := range ctx.ContainerArgs {
|
|
terms = append(terms, arg)
|
|
}
|
|
command := strings.Join(terms, " ")
|
|
return command
|
|
}
|
|
|
|
// ID Returns the Container ID shortened to 12 characters.
|
|
func (ctx *Context) ID() string {
|
|
return ctx.ContainerID[:12]
|
|
}
|
|
|
|
// FullID is an alias of ContainerID.
|
|
func (ctx *Context) FullID() string {
|
|
return ctx.ContainerID
|
|
}
|
|
|
|
// Name returns the ContainerName without a preceding '/'.
|
|
func (ctx *Context) Name() string {
|
|
return ctx.ContainerName[1:]
|
|
}
|
|
|
|
// ImageID returns the ContainerImageID shortened to 12 characters.
|
|
func (ctx *Context) ImageID() string {
|
|
return ctx.ContainerImageID[:12]
|
|
}
|
|
|
|
// ImageFullID is an alias of ContainerImageID.
|
|
func (ctx *Context) ImageFullID() string {
|
|
return ctx.ContainerImageID
|
|
}
|
|
|
|
// ImageName is an alias of ContainerImageName
|
|
func (ctx *Context) ImageName() string {
|
|
return ctx.ContainerImageName
|
|
}
|