Docker logs 日志收集

Posted 探寻天下奇闻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker logs 日志收集相关的知识,希望对你有一定的参考价值。

为什么要日志收集

日志是为了检查服务的运行状态,在服务出现异常的时候,通过排查日志定位问题。无论是我们自己写日志还是服务自带的日志,其目的都是为了有迹可循,那么容器中日志我们为何要单独收集呢?

这是因为,容器运行之后可以看做一个微型的虚拟机,如果需要查看日志,按照正常思路是进入容器查看日志,在一个不部署容器集群里是可以的。但是如果你是通过编排工具启动容器集群的话,容器运行所在的物理机是变动的,而且容器是动态的扩展收缩的,这种情况下我们是无法直接进入相应的容器去查看容器的日志的,所以日志收集一定要进行方案设计。

常见的日志收集方案

常用的docker的日志收集方案大致是四种,docker原生的Docker logs;ELK; Fluentd; graylog。

Docker logs

docker默认会将日志发送到容器的STDOUT和STDERR,其实就是发送到标准输出设备和标准错误设备。我们在启动容器的时候会增加-itd参数:

-i 让容器的标准输出持续打开

-t 让docker分配一个伪终端,并绑定到容器的标准输出上

-d 让容器在后台以守护态形式运行

所以不加参数d运行的话,我们就会在前台看见标准输出,如果加了参数d的话,我们可以选择进入容器查看标准输出,也可以选择docker logs查看标准输出。

Docker支持很多种logging driver。

我们可以通过命令查看你的logging driver,可以看到我的日志driver是journald。参考官方网站:https://docs.docker.com/config/containers/logging/journald/#options

docker info | grep 'Logging Driver'Logging Driver: journald

根据journald driver编写log.py文件查看日志

import systemd.journalreader = systemd.journal.Reader()container_name = raw_input(">>> please input your container_name:")#raw_inputA=raw_input("pls input sth:")reader.add_match('CONTAINER_NAME=%s' % container_name)for msg in reader: print '{CONTAINER_ID_FULL}: {MESSAGE}'.format(**msg)

使用log.py文件交互输入容器名进行日志查询

docker ps -apython log.py>>> please input your container_name:container_name

以上是关于Docker logs 日志收集的主要内容,如果未能解决你的问题,请参考以下文章

fluentd收集Docker stdout日志

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

centos7下安装docker(18.3docker日志---logging driver---fluentd)

K8S 日志收集:生产日志

如何从 docker 容器中收集主机系统日志

docker 定时清理docker容器日志