| 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 |
| } |