日志是服务运行过程中的一个关键环节,借助日志,我们可以排查定位问题,也可以借助集中化的日志管理平台(如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. pip安装psycopg2失败解决

    pip install psycopg2==2.8.4报错ERROR: Command "python setup.py egg_info" failed with error c ...

  2. Fetch API与POST请求那些事

    简述 相信不少前端开发童鞋与后端联调接口时,都会碰到前端明明已经传了参数,后端童鞋却说没有收到,尤其是post请求,遇到的非常多.本文以node.js作为服务端语言,借用express框架,简要分析客 ...

  3. 【每日一包0018】fecha

    [github地址:https://github.com/ABCDdouyae...] fecha 比moment.js更加轻量级的时间解析和格式化包 format 用法:format(<Dat ...

  4. 关于地址栏url的一些小结

    1.获取整个地址栏地址 //获取整个地址栏地址 var href = window.location.href; console.log(href); 以上代码就是获取整个url地址 2.获取url协 ...

  5. 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ZRjGGy 可交互视频 此视频是可 ...

  6. 第一个Hystrix程序 Hystrix 一

    1.导入jar包 <dependencies> <dependency> <groupId>com.netflix.hystrix</groupId> ...

  7. 通过mockjs来制作假数据

    需用用到的模块为express和mockjs //导入模块开启服务器模块 const express=require('express') //导入假数据模块 const mockjs=require ...

  8. 转:标签中的href如何调用js

      在HTML中,<a>标签的href属性用于指定超链接的目标的URL.在所有浏览器中,链接的默认外观是: 未被访问的链接带有下划线而且是蓝色的 已被访问的链接带有下划线而且是紫色的 活动 ...

  9. requests.exceptions.SSLError报错

    requests.exceptions.SSLError: HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries excee ...

  10. try_catch_return

    1.情况一(try中有return,finally中没有return): public class TryTest{ public static void main(String[] args){ S ...