容器的日志支持多种方式,可以通过配置--log-driver=VALUE来选择不同的驱动方式,包含none, json-file,syslog,journald,gelf,fluentd,awslogs,splunk,etwlogs,gcplogs。
none:顾名思义不会做任何日志输出
json-file:把标准输出日志通过以json格式文件的方式展示出来,这也是docker默认的日志输出方式。
--log-opt max-size=[0-9+][k|m|g] #文件的大小
--log-opt max-file=[0-9+] #文件数量
--log-opt labels=label1,label2 #加入label参数
--log-opt env=env1,env2 #加入env参数
syslog:
把日志以syslog的方式输出
--log-opt syslog-address=[tcp|udp|tcp+tls]://host:port
--log-opt syslog-address=unix://path
--log-opt syslog-address=unixgram://path
--log-opt syslog-facility=daemon
--log-opt syslog-tls-ca-cert=/etc/ca-certificates/custom/ca.pem
--log-opt syslog-tls-cert=/etc/ca-certificates/custom/cert.pem
--log-opt syslog-tls-key=/etc/ca-certificates/custom/key.pem
--log-opt syslog-tls-skip-verify=true
--log-opt tag="mailer"
--log-opt syslog-format=[rfc5424|rfc5424micro|rfc3164]
--log-opt env=ENV1,ENV2,ENV3
--log-opt labels=label1,label2,label3
syslog-address支持通过tcp,udp,tcp+tls的方式进行输出,如果没有指定默认方式是本地unix socket。
--log-opt tag=value
选项中可以配置docker详细信息,例如--log-opt tag="{{.ImageName}}/{{.Name}}/{{.ID}}"
{{.ID}} 12位id
{{.FullID}} 全id
{{.Name}} 容器名称
{{.ImageID}} 12位镜像id
{{.ImageFullID}} 全镜像id
{{.ImageName}} 镜像名称
{{.DaemonName}} 后台进程名称
除此以外还可以通过配置go template的方式来获取container的label和env的信息,例如:
docker run -it --rm \
--log-driver syslog \
--log-opt tag="{{ (.ExtraAttributes nil).SOME_ENV_VAR }}" \
--log-opt env=SOME_ENV_VAR \
-e SOME_ENV_VAR=logtester.1234 \
flyinprogrammer/logtester
需要特别注意的地方是,如果想获取container的env的信息那么log-opt env=value
也必须配置相应的env key,label同样也是如此。
从docker源码中可以看出他的获取方式:
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
}