日志是服务运行过程中的一个关键环节,借助日志,我们可以排查定位问题,也可以借助集中化的日志管理平台(如ELK)来做一些必要的数据统计分析。在Docker环境中,日志的采集比传统环境更为复杂,因此了解Docker日志的管理机制,及基于此熟悉日志采集的最佳实践对于开发运维人员来说也是避不开的一个知识点。那就开始吧。

Docker容器的日志管理机制

1. Docker Daemon日志

Docker Daemon在Linux中本身作为systemd service启动,因此可以通过 sudo journalctl -u docker 命令来查看Daemon本身的日志。

2. Docker容器日志

通过 docker logs container_id|container_name 可以查看Docker容器的输出日志,但这里的日志只包含容器的标准输出(STDOUT)与标准错误输出(STDERR),适用于一些将日志输出到STDOUT的容器,比如Nginx,查看nginx的dockerfile可发现其是将日志文件链接到了STDOUT与STDERR来实现的,

    RUN ln -sf /dev/stdout /var/log/nginx/access.log
&& ln -sf /dev/stderr /var/log/nginx/error.log

但如果容器内部应用日志是输出到日志文件(比如Spring Boot项目或Tomcat容器,一般将日志输出到日志文件中),则无法通过 docker logs 命令查看。

docker logs 会显示历史日志,日志太多的话要等半天才能看到最新日志,同时也对Docker Daemon造成一定的压力,可使用 docker logs --tail 200 container_id来查看最新的N条或使用docker logs -f container_id(类似于tail -f)

3. Docker日志处理机制

当我们启动一个容器时,其实是作为Docker Daemon的一个子进程运行,Docker Daemon可以拿到容器里进程的标准输出与标准错误输出,然后通过Docker的Log Driver模块来处理。如下图所示

目前支持的Log Drvier包括:

  • none:容器没有日志,docker logs不输出任何内容
  • local:日志以自定义格式存储
  • json-file:日志以json格式存储,默认的Log Driver
  • syslog:将日志写入syslog。syslog守护程序必须在主机上运行
  • journald:将日志写入journald。journald守护程序必须在主机上运行
  • gelf:将日志写入Graylog Extended Log Format端点,如Graylog或Logstash
  • fluentd:将日志写入fluentd。fluentd守护程序必须在主机上运行
  • awslogs:将日志写入Amazon CloudWatch Logs
  • splunk:通过HTTP Event Collector将日志写入splunk
  • etwlogs:将日志作为ETW(Event Tracing for Windows)事件写入。只在Windows平台可用
  • gcplogs:将日志写入Google Cloud Platform Logging
  • logentries:将日志写入Rapid7 Logentries

使用Docker-CE版本时,docker logs命令仅适用于 local, json-file, journald 三种Log Driver

可通过docker info来查看Docker Daemon(针对所有容器)或docker inspect来查看单个容器所使用的Log Driver

# Docker Daemon
[devuser@test-server-1 ~]$ docker info |grep "Logging Driver"
Logging Driver: json-file
# 单个Docker 容器
[devuser@test-server-1 ~]$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' 76f82aa32468
json-file

修改Docker Daemon使用的Log Driver可通过修改配置文件 /etc/docker/daemon.json 进行,重启Docker后该配置对该Docker Daemon管理的所有容器生效, 如

{
"log-driver": "local",
"log-opts": {
"max-size": "10m",
"max-file": 3
}
}

设置单个容器的Log Driver则可以在容器运行时通过参数指定,如

[root@tool-server ~]# docker run -d --name nginx -p 80:80 --log-driver local  --log-opt max-size=10m  --log-opt max-file=3  --restart=always nginx
63155291e724276d6154a26958b0e523a003958b1cdf7df9f1f0903bfc989b99 [root@tool-server ~]# tail -f /var/lib/docker/containers/63155291e724276d6154a26958b0e523a003958b1cdf7df9f1f0903bfc989b99/local-logs/container.log
stdoutҭʡ

Docker笔记(十三):容器日志采集实践的更多相关文章

  1. ELK:收集k8s容器日志最佳实践

    简介 关于日志收集这个主题,这已经是第三篇了,为什么一再研究这个课题,因为这个课题实在太重要,而当今优秀的开源解决方案还不是很明朗: 就docker微服务化而言,研发有需求标准输出,也有需求文件输出, ...

  2. Docker笔记--操作容器命令

    Docker笔记--操作容器命令 创建容器 docker [container] create-- 创建容器,使用docker [container] create命令新建的容器处于停止状态,可以使用 ...

  3. docker~service将容器日志输出到fluentd

    我们把微小的服务发布到docker里,然后实现docker service启动它,保证了服务的高可用性,然后把服务产生的日志输出到fluentd,由它进行过滤和转发,存储到elasticsearch里 ...

  4. docker logs 查看容器日志操作

    查看日志 官方文档:https://docs.docker.com/engine/reference/commandline/logs/ # 查看指定数量的实时日志 # docker logs -tf ...

  5. docker容器日志收集方案汇总评价总结

    docker日志收集方案有太多,下面截图罗列docker官方给的日志收集方案(详细请转docker官方文档).很多方案都不适合我们下面的系列文章没有说. 经过以下5篇博客的叙述简单说下docker容器 ...

  6. centos7下安装docker(18.2docker日志---ELK)

    ELK是三个软件得组合:Elasticsearch,Logstash,Kibana Elasticsearch:实时查询的全文搜索引擎.Elasticsearch的设计目的就是能够处理和搜索巨量的日志 ...

  7. 用elk+filebeat监控容器日志

    elk  为 elasticsearch(查询搜索引擎),logstash(对日志进行分析和过滤,然后转发给elasticsearch),kibana(一个web图形界面用于可视化elasticsea ...

  8. Docker容器日志管理最佳实践

    目录 一 .Docker 引擎日志 二.容器日志 2.1.常用查看日志命令--docker logs 2.2 .Docker 日志 驱动 三. 生产环境中该如何储存容器中的日志 一.当是完全是标准输出 ...

  9. Docker笔记(十一):Dockerfile详解与最佳实践

    Dockerfile是一个文本文件,包含了一条条指令,每条指令对应构建一层镜像,Docker基于它来构建一个完整镜像.本文介绍Dockerfile的常用指令及相应的最佳实践建议. 1. 理解构建上下文 ...

随机推荐

  1. bootstrap-select and selectpicker 修改下拉框的宽度或者下方留白

    bootstrap-select and selectpicker 修改下拉框的宽度或者下方留白 $("#sel_userName").selectpicker({ "w ...

  2. Pycharm+PyQt5开发环境配置

    一.安装Python开发环境 python官网下载地址:https://www.python.org/downloads/ 注:千万不要使用最新测试版,很有可能第三方库不支持 笔者目前使用的版本是3. ...

  3. 弹性盒子Flex Box滚动条原理,避免被撑开,永不失效

    在HTML中,要实现区域内容的滚动,只需要设定好元素的宽度和高度,然后设置CSS属性overflow 为auto或者scroll:   在Flex box布局中,有时我们内容的宽度和高度是可变的,无法 ...

  4. 【Geek议题】当年那些风骚的跨域操作

    前言 现在cross-origin resource sharing(跨域资源共享,下简称CORS)已经十分普及,算上IE8的不标准兼容(XDomainRequest),各大浏览器基本都已支持,当年为 ...

  5. iview 踩坑之旅

    公司重构管理系统,框架定了vue,UI在element和iview之间选,element样式被吐槽丑,于是选了iview,但是,,这个坑多啊... 废话少说,罗列了iview中容易出错或者懵逼的一些地 ...

  6. 操作系统-schedule函数

    1. Linux 0.11的调度函数schedule() 也就是找到了counter最大的进程,然后就跳出去执行switch_to,对应上面的优先级算法,而counter本身也是时间片,也作了轮转调度 ...

  7. go学习第五天、运算符

    算术运算符 下表列出了所有Go语言的算术运算符.假定 A 值为 10,B 值为 20 运算符 描述 实例 + 相加 A + B 输出结果 30 - 相减 A - B 输出结果 -10 * 相乘 A * ...

  8. R自带数据集

    向量 euro    #欧元汇率,长度为11,每个元素都有命名landmasses    #48个陆地的面积,每个都有命名precip   #长度为70的命名向量rivers   #北美141条河流长 ...

  9. MATLAB神经网络(6) PID神经元网络解耦控制算法——多变量系统控制

    6.1 案例背景 6.1.1 PID神经元网络结构 PID神经元网络从结构上可以分为输入层.隐含层和输出层三层,$n$个控制量的PID神经元网络包含$n$个并列的相同子网络,各个子网络间既相互独立,又 ...

  10. scrapy启动

    创建项目 在开始爬取之前,您必须创建一个新的Scrapy项目. 进入您打算存储代码的目录中,运行下列命令: scrapy startproject scrapytest 第一种scrapy gensp ...