docker log

容器的日志支持多种方式,可以通过配置--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

}

你可能感兴趣的:(docker log)