Docker 日志

Docker的日志可以分为两类:

  • stdout标准输出日志

    stdout就是标准输出里面的日志, 比如程序运行时输出在控制台的内容就会写入标准输出

    原理就是当在启动进程的时候,进程之间有一个父子关系,父进程可以拿到子进程的标准输出

  • 文件日志

    直接写入磁盘的日志, 例如java使用log4j框架直接将日志落盘(不在控制台输出)就是典型的文件日志

所有的容器通过Docker Daemon启动,实际上属于Docker的一个子进程, 它可以拿到你的容器里面进程的标准输出,然后拿到标准输出之后,会通过它自身的一个叫做LogDriver的模块来处理.

LogDriver就是Docker用来处理容器标准输出的一个模块。 Docker支持很多种不同的处理方式,比如你的标准输出之后,在某一种情况下会把它写到一个日志里面.

1. 查看日志

可以通过docker logs [containerID]命令查看容器的日志

$ docker logs [OPTIONS] CONTAINER
Options:
--details 显示更多的信息
-f, --follow 跟踪实时日志
--since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
--tail string 从日志末尾显示多少行日志, 默认是all
-t, --timestamps 显示时间戳
--until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

例子:

查看指定时间后的日志,只显示最后100行:

$ docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID

查看最近30分钟的日志:

$ docker logs --since 30m CONTAINER_ID

查看某时间之后的日志:

$ docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID

查看某时间段日志:

$ docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID

2. 日志在哪?

日志一般都会落盘在宿主机的/var/lib/docker文件夹下, 具体的信息可以通过docker inspect命令查看:

$ docker inspect [OPTIONS] CONTAINER

例如:

$ docker inspect -f {{".LogPath"}} 2be

输出:

/data/docker/containers/2be9b6dc81a557d11d84bc33bf1062462da9b62e59cc9faef9251bdcff26f3ad/2be9b6dc81a557d11d84bc33bf1062462da9b62e59cc9faef9251bdcff26f3ad-json.log

这就是这个容器的日志记录文件了

日志文件相关信息

日志记录系统一般都可以对日志文件进行拆分, 比如按日期, 按大小等.在Docker的日志记录系统下也是可以实现的, 默认情况下一个容器会产生一个日志文件, 没有大小限制, 不会根据日期拆分, 即从容器启动到容器销毁, 日志文件永远是那一个.

也可以通过一些配置项进行配置, 例如json-file模式:

选项 描述 示例值
max-size 日志文件的最大大小, 默认为-1(无限制) --log-opt max-size=10m
max-file 可以存在的最大日志文件数。如果滚动日志会创建多余的文件,则会删除最早的文件。仅在max-size设置时有效。一个正整数。默认为1。 --log-opt max-file=3
labels 在启动Docker守护程序时适用。该守护程序接受的与日志记录相关的标签的逗号分隔列表。用于高级日志标签选项 --log-opt labels=production_status,geo
env 在启动Docker守护程序时适用。该守护程序接受的与日志相关的环境变量的逗号分隔列表。用于高级日志标签选项 --log-opt env=os,customer
env-regex 与相似并兼容env。用于匹配与日志记录相关的环境变量的正则表达式。用于高级日志标签选项 `--log-opt env-regex=^(os
compress 切换旋转日志的压缩。默认值为disabled --log-opt compress=true

3. 配置LogDriver

Docker官方目前支持这些log driver, 默认使用的是json-file模式:

Driver Description
none 丢弃容器输出
local 日志以自定义格式存储
json-file 日志存储格式为json, 默认的logdriver驱动
syslog 日志写入到指定的syslog地址
journald 日志写入到指定jounald
gelf 以gelf格式发送日志
fluentd 日志发送到指定的fluentd服务
awslogs 日志发送到指定的Amazon CloudWatch Logs
splunk 日志发送到指定的splunk服务
etwlogs 日志发送到Event Tracing for Windows, 仅支持windows平台
gcplogs 日志发送到Google Cloud日志系统
logentries 日志发送到Rapid7 Logentries

有两种方法可以修改docker的LogDriver

  • 修改Docker Daemon, 这样会对所有容器生效, 以syslog为例:

    dockerd --log-driver=syslog --log-opt syslog-address=127.0.0.1:514
  • 在容器启动时加上配置项, 这样配置只会对当前容器生效:

    docker run --log-driver=syslog --log-opt syslog-address=127.0.0.1:514 nginx:laster

除了上述的这些logdriver, 也可以自定义logdriver, 并且通过docker plugin install进行安装, 详情可见:

使用日志记录驱动程序插件

Docker容器日志的种类以及存储的更多相关文章

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

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

  2. Docker 容器日志分析

    查看容器日志 先使用  docker run -it --rm -d -p 80:80 nginx:1.15.8-alpine 命令启动一个nginx容器.如果没有异常,会得到容器ID如  d2408 ...

  3. docker容器日志管理

    docker容器日志分为两类:docker引擎日志(Docker本身运行的日志)和容器日志(各个容器内产生的日志) 一.Docker引擎日志: Centos系统下的docker引擎日志一般给syste ...

  4. docker 容器日志集中 ELK + filebeat

    docker 容器日志集中 ELK ELK 基于 ovr 网络下 docker-compose.yaml version: '2' networks: network-test: external: ...

  5. docker容器日志收集方案(方案二 filebeat+syslog本地日志收集)

    与方案一一样都是把日志输出到本地文件系统使用filebeat进行扫描采集 不同的是输出的位置是不一样的 我们对docker进行如下设置 sudo docker service update  --lo ...

  6. docker容器日志收集方案(方案一 filebeat+本地日志收集)

    filebeat不用多说就是扫描本地磁盘日志文件,读取文件内容然后远程传输. docker容器日志默认记录方式为 json-file 就是将日志以json格式记录在磁盘上 格式如下: { " ...

  7. Docker 容器日志格式化

    Docker容器的日志文件每一行都是一个json对象,其包含log.stream.time三个属性,下面的HTML从textarea中读取输入的日志信息,格式化为表格显示. <!DOCTYPE ...

  8. 实时查看docker容器日志

    实时查看docker容器日志 $ sudo docker logs -f -t --tail 行数 容器名 例:实时查看docker容器名为s12的最后10行日志 $ sudo docker logs ...

  9. docker容器日志清理

    1.先查看磁盘空间 df -h 2.找到容器的containerId-json.log文件,并清理(治标不治本,log迟早还会大的) 查看各个容器的log文件大小 find /var/lib/dock ...

随机推荐

  1. 一、neo4j中文文档-入门指南

    目录 neo4j中文文档-入门指南 Neo4j v4.4 neo4j **Cypher ** 开始使用 Neo4j 1. 安装 Neo4j 2. 文档 图数据库概念 1. 示例图 2.节点 3. 节点 ...

  2. Sentry 开发者贡献指南 - 什么是 Scope, 什么是 Hub?

    当一个事件被捕获并发送到 Sentry 时,SDK 会将该事件数据与来自当前 scope 的额外信息合并.SDK 通常会在框架集成中为您自动管理 scope,您无需考虑它们.但是,您应该知道 scop ...

  3. 0,NULL和nullpter

    #include <iostream> using namespace std; void f(int) { cout<<"f(int)"<<e ...

  4. java继承子类实例化过程(细节解释)

    1 package face_08; 2 class Fu{ 3 Fu(){ 4 super(); 5 show(); 6 return; 7 } 8 void show() { 9 System.o ...

  5. java多态成员变量、成员函数(非静态)、静态函数特点

    1 package face_09; 2 3 /* 4 * 多态时, 5 * 成员的特点: 6 * 1,成员变量. 7 * 编译时:参考引用型变量所属类中的是否有调用的成员变量,有,编译通过:没有,编 ...

  6. 西安腾讯DevOps面试题python算法输出列表数值下界

    给定一个列表,然后给一个目标值,列表中两数求和等于目标值,要求输出列表两数的下界 如 list = [1,2,3,4,6,7,8] num=10 #!/usr/bin/python #coding=u ...

  7. Docker挂载主机目录到容器

    docker run -it -v /宿主机绝对目录:/容器内目录 镜像名

  8. 使用VSCode在本地电脑上对树莓派远程开发

    目的及原理 有时身边没有额外的显示器和键盘,或者有时树莓派在另一个屋子连接着路由器,那么当我们想在树莓派上做开发时就可以使用VS Code的远程开发能力.下面一张图显而易见地说明了远程开发的工作原理( ...

  9. python网络爬虫-静态网页抓取(四)

    静态网页抓取 在网站设计中,纯HTML格式的网页通常被称之为静态网页,在网络爬虫中静态网页的数据比较容易抓取,因为说有的数据都呈现在网页的HTML代码中.相对而言使用Ajax动态加载的玩个的数据不一定 ...

  10. linux apache软件安装

    安装提示 Linux下,源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install). 过程中用到"configure --prefix=安装 ...