千家信息网

详解Docker容器的日志处理

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,Docker有很多的日志插件,默认使用 json-file,只有使用json-file时,sudo docker logs -f 才可以显示,输入以下命令查看docker日志插件:$ sudo doc
千家信息网最后更新 2025年12月03日详解Docker容器的日志处理

Docker有很多的日志插件,默认使用 json-file,只有使用json-file时,sudo docker logs -f 才可以显示,输入以下命令查看docker日志插件:

$ sudo docker info | grep Logging

这里先说明一下,当容器运行时,docker会在宿主机上创建一个该容器相关的文件,然后将容器产生的日志转存到该文件下。docker logs -f 命令就会找到该文件内容并显示在终端上。

我们都知道docker logs -f会将所有对应的服务日志输出到终端,无论服务的部署在哪个节点上,那么我现在提出一个问题,是否每个节点对应的容器文件,都会保存该服务的完整日志备份,还是只保存该节点服务对应容器产生的日志?

因为这个问题涉及到每个节点如果都用filebeat监听宿主机的容器日志文件,那么如果每个节点的容器日志都是一个完整的备份,日志就会重复,如果只是保存该节点上容器的日志,就不会。

答案是只保留该节点上容器的日志,docker logs -f 命令只不过在overlay网络模型上走了一层协议,把在其它节点上的相同的容器日志汇聚起来。

默认使用docker的json-file,首先配置daemon:

$ sudo dockerd \--log-driver=json-file \--log-opt labels=servicename

启动容器需要添加如下参数:

$ sudo docker service update --label servicename=test

或者直接在docker-compose.yml中标记:

version: "3"services: go-gin-demo:  image: chenghuizhang/go-gin-demo:v3  ports:   - 8081:8081  networks:   - overlay  deploy:   mode: replicated   replicas: 3  labels:   servicename: go-gin-demoxxxxxxx  logging:   options:    labels: "servicename"networks: overlay:

在每个节点安装filebeat,并且filebeat.yml配置如下:

filebeat.prospectors:- type: log  paths:                # 容器的日志目录   - /var/lib/docker/containers/*/*.log   # 因为docker使用的log driver是json-file,因此采集到的日志格式是json格式,设置为true之后,filebeat会将日志进行json_decode处理  json.keys_under_root: true  tail_files: trueoutput.logstash: hosts: ["172.17.10.114:5044"]

在logstash.conf中配置索引:

output { elasticsearch {  action => "index"  hosts => ["172.17.10.114:9200"]  # 获取日志label  index => "%{attrs.servicename}-%{+YYYY.MM.dd}" }}

Dockerfile文件需要将项目输出的日志打印到stdout和stderr中,不然json-file日志驱动不会收集到容器里面输出的日志,sudo docker logs -f就在终端显示不了容器日志了,在Dockerfile中需加入以下命令:

RUN ln -sf /dev/stdout /xx/xx.log \ # info        && ln -sf /dev/stderr /xx/xx.log # error

或者在在项目的log4j配置输出控制台:

        

如果日志需要记录容器id名称和镜像名称,在运行容器时可以加入以下参数:

--log-opt tag="//"

最终,json-file日志插件将容器打印到控制台的日志生成到本地 /var/lib/docker/containers/*/ 目录中,格式如下:

{  "log":"[GIN-debug] [WARNING] Now Gin requires Go 1.6 or later and Go 1.7 will be required soon.",  "stream":"stderr",  "attrs":{    "tag":"chenghuizhang/go-gin-demo:v3@sha256:e6c0419d64e5eda510056a38cfb803750e4ac2f0f4862d153f7c4501f576798b/mygo.2.jhqptjugfti2t4emf55sehamo/647eaa4b3913",    "servicename":"test"  },  "time":"2019-01-29T10:08:59.780161908Z"}

在logstash中格式化日志:

filter { grok {  patterns_dir => "/etc/logstash/conf.d/patterns"  match => {"message" => "%{TIMESTAMP_ISO8601:time}%{SERVICENAME:attr.servicename}%{DOCKER_TAG:attr.tag}"}}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

日志 容器 节点 文件 命令 格式 服务 输出 配置 插件 终端 内容 参数 名称 备份 宿主 控制台 目录 问题 项目 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京山下软件开发 查看数据库当前日期 深夜造访网络安全术语 天津阿里商务网络技术有限公 csgo完美世界无法连接服务器 求电子科技互联网类小说 网络安全产品的质量状况 从数据库中随机抽取一些数据 vr软件开发平台 网络安全专家 成都 dell服务器网卡驱动 家长对网络安全教育心得体会 数据库桂电 外媒报道云上贵州服务器 网络安全等级保护测评企业 oracl数据库视图查询 网络安全系统最基本的功能是 哪个不属于网络技术发展趋势 北京繁星网络技术有限公司 河北特种网络技术市场价 信息在数据库的查询的原理 南方手簿x3登陆服务器上不去 ps4原生服务器无法连接 内蒙古数据库安全审计系统 服务器能当普通笔记本用吗 昆明火锅店自助扫码点餐软件开发 btok服务器代码 盈趣科技与工业互联网 濮阳市国家网络安全宣传周活动 警告服务器在美国维护
0