日志是服务运行过程中的一个关键环节,借助日志,我们可以排查定位问题,也可以借助集中化的日志管理平台(如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ҭʡ
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)