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

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,986评论 19 139
  • 感恩分享:试图以改变外在的世界来追求完美是徒劳无功的。永远会有你意想不到的事情出现,把毫无准备的你激怒。你有多...
    雪域红梅阅读 188评论 0 0
  • 编辑git配置文件 sudo vim .git/config 在后面添加,然后在拉去后输入账号密码即可 [cred...
    lanchc阅读 1,581评论 0 0
  • 那一天,我终于决定去旅行 在小猫的眼睛里,在鸟儿的眼睛里,到处留下我的脚印 于是所有的神秘都向后退,退成...
    一生一世周杰伦阅读 162评论 0 1
  • 一件小事 上周在苏州开会。一天中午吃完饭我回酒店房间。 出电梯、进走廊,我把房卡拿在手里,准备一会儿开门。快到房间...
    心心的礼物阅读 255评论 0 0