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} terms = append(terms, ctx.ContainerArgs...) 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 }