日志是服务运行过程中的一个关键环节,借助日志,我们可以排查定位问题,也可以借助集中化的日志管理平台(如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. 深入理解JVM(线程部分) Note

    硬件的效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:将 ...

  2. Go语言基础篇(1) —— 编写第一个Go程序

    创建文件hello_world.go package main //包,表名代码所在的包 import "fmt" //引入依赖 //main方法 func main(){ fmt ...

  3. 7-1 jmu-python-汇率兑换 (10 分)

    7-1 jmu-python-汇率兑换 (10 分)   按照1美元=6人民币的汇率编写一个美元和人民币的双向兑换程序 输入格式: 输入人民币或美元的金额,人民币格式如:R100,美元格式如:$100 ...

  4. 峰哥说技术:08-Spring Boot整合FreeMarker视图

    Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 08  峰哥说技术:Spring Boot整合FreeMarker视图 前面带着大家整合了Thymelea ...

  5. Echarts 自定义legend图片,修改点击之后的颜色图解

    第一个问题:echarts 可以自定义图例的图标,百度上很多回答都是引用的相对路径,但是不知道为啥,我的vue项目就是引用不显示,在network里面找不到相应图片 后来我想了个法子,就是先获取到这个 ...

  6. React的组件

    React的组件化思想尤为明显,一切皆组件,觉着比Vue的组件化思想更加凸显. const PacketBG = (props) =>( <div className="pack ...

  7. vs远程调试iis

    1.在开发电脑上 找到 D:\Software\VS2010\Common7\IDE\Remote Debugger 下面msvsmon.exe所在的两个文件夹x86和x64,使用x86或者x64是根 ...

  8. 助力SpringBoot自动配置的条件注解ConditionalOnXXX分析--SpringBoot源码(三)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 如何分析SpringBoot源码模块及结构?--SpringBoot源码(二) 上一篇分析了SpringBoo ...

  9. Django的路由系统01-路由分发

    1. Including other URLconfs 原urls.py文件,多个app的路由系统写在一起,不方便管理 范例: from django.conf.urls import url fro ...

  10. js 模拟鼠标绘制方块

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...