跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 工具系统 > 数据分析 > Linux系列:docker标准输出日志存储位置,设置docker日志文件大小

Linux系列:docker标准输出日志存储位置,设置docker日志文件大小

时间:2024-04-27 15:00:28 来源:网络cs 作者:康由 栏目:数据分析 阅读:

标签: 日志  设置  文件  位置  系列  标准  输出 

docker标准输出日志存储位置,设置docker日志文件大小

一. docker标准输出日志存储位置,设置docker日志文件大小docker日志存储位置docker容器日志导致磁盘空间爆满设置docker容器日志大小(全局设置)注意:设置的日志大小,只对新建的容器有效。 k8s中的容器日志说明一个容器中日志文件的大小最大为100m,最多10个文件,一个容器的日志最多保存1000m日志数据热评(原文章评论) 二. Docker 日志都在哪里?怎么收集?Docker 引擎日志容器日志 三. Docker容器日志查看与清理(亲测有效)1. 问题2. 解决方法2.1 找出Docker容器日志2.2 清理Docker容器日志(治标)2.3 设置Docker容器日志大小(治本)设置一个容器服务的日志大小上限全局设置 原文中评论 四. Docker容器日志清理原文中评论1. docker ps |awk '{if (NR>1){print $1}}' |xargs docker inspect --format='{{.LogPath}}' | xargs truncate -s 02. docker inspect 【container name】| grep LogPath | cut -d ':' -f 2 | cut -d ',' -f 1 | xargs echo | xargs truncate -s 0 五. docker日志设置定期清理六. 轻松搞定对容器实例日志设置定期清理和回卷引言通过logrotate服务实现日志定期清理和回卷具体的实施方案如下图所示:创建DaemonSet的示例如下:通过修改dockerd参数进行回卷和清理




一. docker标准输出日志存储位置,设置docker日志文件大小

docker日志存储位置

在Linux系统中docker启动后日志存储在/var/lib/docker/containers/容器ID/目录中,启动一个容器后,容器ID目录中会生成如下文件:

-rw-r----- 1 root root 10325 Nov 16 14:09 12f7f218aa3ba42cf58e3a77ab7ff615c3b06cb04c8d2f22561592c2ea2d3126-json.logdrwx------ 2 root root  4096 Nov 16 14:07 checkpoints-rw------- 1 root root  3664 Nov 16 14:07 config.v2.json-rw-r--r-- 1 root root  1514 Nov 16 14:07 hostconfig.json-rw-r--r-- 1 root root    13 Nov 16 14:07 hostname-rw-r--r-- 1 root root   174 Nov 16 14:07 hostsdrwx------ 2 root root  4096 Nov 16 14:07 mounts-rw-r--r-- 1 root root   108 Nov 16 14:07 resolv.conf-rw-r--r-- 1 root root    71 Nov 16 14:07 resolv.conf.hash

每个容器的日志默认都会以 json-file 的格式存储于/var/lib/docker/containers/<容器id>/<容器id>-json.log 下,不过并不建议去这里直接读取内容,因为容器的日志则可以通过 docker logs命令来访问,而且可以像 tail -f 一样,使用 docker logs -f 来实时查看。如果使用 Docker Compose,则可以通过 docker-compose logs <服务名> 来查看。

docker容器日志导致磁盘空间爆满

从上面可以知道docker容器日志存储在文件中,容器销毁后/var/lib/docker/containers/<容器id>/目录会被自动删除,所以容器日志也被一并删除。如果容器一直运行并且一直产生日志,容器日志会导致磁盘空间爆满,如何解决这个问题?

设置docker容器日志大小(全局设置)

新建/etc/docker/daemon.json,若有就不用新建了。添加log-dirver和log-opts参数,如下:

# vim /etc/docker/daemon.json{  "registry-mirrors": ["http://f613ce8f.m.daocloud.io"],  "log-driver":"json-file",  "log-opts": {"max-size":"500m", "max-file":"3"}}

max-size=500m,意味着一个容器日志大小上限是500M

max-file=3,意味着一个容器最多有三个日志,分别是:容器id-json.log容器id-json.log.1容器id-json.log.2, 当日志文件的大小达到500m时,自动划分文件保存,最多划分3个文件

这两个参数设置之后说明,一个容器最多保存1500m(3 * 500)日志,超过范围的日志不会被保存,文件中保存的是最新的日志,文件会自动滚动更新。

# 重启docker守护进程systemctl daemon-reload# 重启dockersystemctl restart docker
注意:设置的日志大小,只对新建的容器有效。

设置完成之后,需要删除容器,并重新启动容器,我们可以看到/var/lib/docker/containers/<容器id>/hostconfig.json文件的变化如下:

设置log-opts之前:

cat hostconfig.json# 其中的LogConfig如下"LogConfig": {"Type": "json-file","Config": {}}

设置log-opts之后:

cat hostconfig.json# 其中的LogConfig如下"LogConfig": {"Type": "json-file","Config": {"max-file": "3","max-size": "500m"}}

k8s中的容器日志

在k8s集群中docker容器日志/var/lib/docker/containers/容器ID/目录的文件如下:

-rw-r----- 1 root root  27K Oct 30 19:45 830b17595b2c5cac86e9294b00e90d90e867d7d67489b4e4ee47f847d4726efb-json.logdrwx------ 2 root root 4.0K Oct 30 19:44 checkpoints-rw------- 1 root root  24K Oct 30 19:44 config.v2.json-rw-r--r-- 1 root root 2.1K Oct 30 19:44 hostconfig.jsondrwx------ 2 root root 4.0K Oct 30 19:44 mounts

与docker容器目录相比少了一些文件:hostname、hosts、resolv.conf、resolv.conf.hash

k8s通过sandbox(pause容器,关于pause容器的介绍可以查阅资料)关联了这些文件,通过查看cat config.v2.json可以发现如下配置:

"HostnamePath": "/var/lib/docker/containers/27c9b0c0d1d7c8c7db515f96d5ae8c50ef7aeea02ecddcaa6546ea233dc5445c/hostname","HostsPath": "/var/lib/kubelet/pods/88f3a665-fdd1-4ad5-b0e0-0b613f762b4c/etc-hosts","ShmPath": "/var/lib/docker/containers/27c9b0c0d1d7c8c7db515f96d5ae8c50ef7aeea02ecddcaa6546ea233dc5445c/mounts/shm","ResolvConfPath": "/var/lib/docker/containers/27c9b0c0d1d7c8c7db515f96d5ae8c50ef7aeea02ecddcaa6546ea233dc5445c/resolv.conf",

使用命令cat /var/lib/docker/containers/<容器id>/hostconfig.json查看hostconfig.json的内容,发现有如下设置:

{"Binds": ["/var/lib/kubelet/pods/e268cba1-95c6-4c16-904c-6be0b70344ea/volumes/kubernetes.io~secret/default-token-7vpxg:/var/run/secrets/kubernetes.io/serviceaccount:ro","/var/lib/kubelet/pods/e268cba1-95c6-4c16-904c-6be0b70344ea/etc-hosts:/etc/hosts","/var/lib/kubelet/pods/e268cba1-95c6-4c16-904c-6be0b70344ea/containers/demo/eee5300c:/dev/termination-log"],"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {"max-file": "10","max-size": "100m"}},"NetworkMode": cd "container:ab24db5934f3a0153d9deb3c2de054c87148c3919f1bc2b1d2c11c4c8a2c8c57","PortBindings": null,//其他参数没有列出来............}
说明一个容器中日志文件的大小最大为100m,最多10个文件,一个容器的日志最多保存1000m日志数据

下面列出了一个容器的日志文件达到设置值的情况:

total 927Mdrwx------ 2 root root 4.0K Sep  9 14:51 checkpoints-rw------- 1 root root  24K Sep  9 14:51 config.v2.json-rw-r----- 1 root root  69M Nov 16 14:21 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log-rw-r----- 1 root root  96M Nov 16 07:24 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.1-rw-r----- 1 root root  96M Nov 15 21:49 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.2-rw-r----- 1 root root  96M Nov 15 12:04 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.3-rw-r----- 1 root root  96M Nov 15 02:21 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.4-rw-r----- 1 root root  96M Nov 14 16:47 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.5-rw-r----- 1 root root  96M Nov 14 07:11 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.6-rw-r----- 1 root root  96M Nov 13 21:35 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.7-rw-r----- 1 root root  96M Nov 13 11:57 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.8-rw-r----- 1 root root  96M Nov 13 02:21 f627a603df6e162645d6e29ad27b379b1b92607ea3a95667bcfcd851d9695f38-json.log.9-rw-r--r-- 1 root root 2.2K Sep  9 14:51 hostconfig.jsondrwx------ 2 root root 4.0K Sep  9 14:51 mounts
热评(原文章评论)

设置完日志大小和个数后,cat hostconfig.json没有任何变化,还是设置之前的个数和大小表情包




二. Docker 日志都在哪里?怎么收集?

日志分两类,一类是 Docker 引擎日志;另一类是 容器日志

Docker 引擎日志

Docker 引擎日志 一般是交给了 Upstart(Ubuntu 14.04) 或者 systemd (CentOS 7, Ubuntu 16.04)。前者一般位于 /var/log/upstart/docker.log 下,后者一般通过 jounarlctl -u docker 来读取。不同系统的位置都不一样,SO上有人总结了一份列表,我修正了一下,可以参考:

系统日志位置
Ubuntu(14.04)/var/log/upstart/docker.log
Ubuntu(16.04)journalctl -u docker.service
CentOS 7/RHEL 7/Fedorajournalctl -u docker.service
CoreOSjournalctl -u docker.service
OpenSuSEjournalctl -u docker.service
OSX~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/log/d‌​ocker.log
Debian GNU/Linux 7/var/log/daemon.log
Debian GNU/Linux 8journalctl -u docker.service
Boot2Docker/var/log/docker.log

容器日志

容器的日志 则可以通过 docker logs 命令来访问,而且可以像 tail -f 一样,使用 docker logs -f 来实时查看。如果使用 Docker Compose,则可以通过 docker-compose logs <服务名> 来查看。

如果深究其日志位置,每个容器的日志默认都会以 json-file 的格式存储于 /var/lib/docker/containers/<容器id>/<容器id>-json.log 下,不过并不建议去这里直接读取内容,因为 Docker 提供了更完善地日志收集方式 - Docker 日志收集驱动

关于日志收集,Docker 内置了很多日志驱动,可以通过类似于 fluentd, syslog 这类服务收集日志。无论是 Docker 引擎,还是容器,都可以使用日志驱动。比如,如果打算用 fluentd 收集某个容器日志,可以这样启动容器:

$ docker run -d \--log-driver=fluentd \--log-opt fluentd-address=10.2.3.4:24224 \--log-opt tag="docker.{{.Name}}" \nginx

其中 10.2.3.4:24224fluentd 服务地址,实际环境中应该换成真实的地址。




三. Docker容器日志查看与清理(亲测有效)

1. 问题

docker容器日志导致主机磁盘空间满了。docker logs -f container_name噼里啪啦一大堆,很占用空间,不用的日志可以清理掉了。

2. 解决方法

2.1 找出Docker容器日志

在linux上,容器日志一般存放在/var/lib/docker/containers/container_id/下面, 以json.log结尾的文件(业务日志)很大,查看各个日志文件大小的脚本docker_log_size.sh,内容如下:

#!/bin/shecho "======== docker containers logs file size ========"  logs=$(find /var/lib/docker/containers/ -name *-json.log)  for log in $logs          do               ls -lh $log           done  
# chmod +x docker_log_size.sh# ./docker_log_size.sh
2.2 清理Docker容器日志(治标)

如果docker容器正在运行,那么使用rm -rf方式删除日志后,通过df -h会发现磁盘空间并没有释放。原因是在Linux或者Unix系统中,通过rm -rf或者文件管理器删除文件,将会从文件系统的目录结构上解除链接(unlink)。如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。正确姿势是cat /dev/null > *-json.log,当然你也可以通过rm -rf删除后重启docker。接下来,提供一个日志清理脚本clean_docker_log.sh,内容如下:

#!/bin/sh   echo "======== start clean docker containers logs ========"    logs=$(find /var/lib/docker/containers/ -name *-json.log)    for log in $logs          do                  echo "clean logs : $log"                  cat /dev/null > $log          done  echo "======== end clean docker containers logs ========"  
# chmod +x clean_docker_log.sh# ./clean_docker_log.sh

但是,这样清理之后,随着时间的推移,容器日志会像杂草一样,卷土重来。

2.3 设置Docker容器日志大小(治本)
设置一个容器服务的日志大小上限

上述方法,日志文件迟早又会涨回来。要从根本上解决问题,需要限制容器服务的日志大小上限。这个通过配置容器docker-compose的max-size选项来实现

nginx:   image: nginx:1.12.1   restart: always   logging:     driver: “json-file”     options:       max-size: “5g” 

重启nginx容器之后,其日志文件的大小就被限制在5GB,再也不用担心了。

全局设置

新建/etc/docker/daemon.json,若有就不用新建了。添加log-dirver和log-opts参数,样例如下:

# vim /etc/docker/daemon.json{  "registry-mirrors": ["http://f613ce8f.m.daocloud.io"],  "log-driver":"json-file",  "log-opts": {"max-size":"500m", "max-file":"3"}}

max-size=500m,意味着一个容器日志大小上限是500M,
max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。

// 重启docker守护进程# systemctl daemon-reload# systemctl restart docker

注意:设置的日志大小,只对新建的容器有效。

原文中评论

如果是要清除全部日志的话,直接一条语句就能清除:
find /var/lib/docker/containers/ -name *-json.log | awk ‘{print "echo > "$1}’ | sh

简单一点,linux 上执行
truncate -s 0 /var/lib/docker/containers//-json.log

问一下,设置的容器日志大小上限超过了docker会怎么办?

被清理?

为什么要添加log-dirver参数?

A:你可以查看docker官方文档的log-driver配置选项,daemon的配置参数列表 网页链接

Q:不加也可以,不加就用默认的了,此文讲的是如何限制日志大小,就不要把无关的写上去了




四. Docker容器日志清理

docker容器导致主机磁盘空间满了

如何清理Docker容器日志?

如何找出docker容器日志文件

容器日志一般存放在/var/lib/docker下面,可使用如下命令查看各个日志的文件大小

ls -lh $(find /var/lib/docker/containers/ -name *-json.log)

如何清理日志

如果docker容器正在运行,那么使用rm -rf 方式删除日志后,通过df -h会发现磁盘空间并没有释放

原因:在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用

正确姿势是cat /dev/null > *-json.log,当然你也可以通过rm删除后重启docker

清理脚本:

#!/bin/shecho "==================== start clean docker containers logs =========================="logs=$(find /var/lib/docker/containers/ -name *-json.log)for log in $logs        do                echo "clean logs : $log"                cat /dev/null > $log        doneecho "==================== end clean docker containers logs   =========================="

原文中评论

1. docker ps |awk ‘{if (NR>1){print $1}}’ |xargs docker inspect --format=‘{{.LogPath}}’ | xargs truncate -s 0
2. docker inspect 【container name】| grep LogPath | cut -d ':' -f 2 | cut -d ',' -f 1 | xargs echo | xargs truncate -s 0

示例:ocker inspect jenkins | grep LogPath | cut -d ':' -f 2 | cut -d ',' -f 1 | xargs echo | xargs truncate -s 0

这种方式应该更简单

Q:
请问为什么我使用这个命令不行?执行后给出如下提示:
[1] 27441
[java@docker-test data]$ cut:选项需要一个参数 – d
Try ‘cut --help’ for more information.

什么原因呢?

A:
解析错了,用这个吧:docker inspect 【container name】| grep LogPath | cut -d ‘:’ -f 2 | cut -d ‘,’ -f 1 | xargs echo | xargs truncate -s 0

【container name】直接替换成容器名称,例如:docker inspect jenkins | grep LogPath | cut -d ‘:’ -f 2 | cut -d ‘,’ -f 1 | xargs echo | xargs truncate -s 0




五. docker日志设置定期清理

rancher的介绍中也有docker相关的 “docker调优”:https://docs.rancher.cn/rancher2x/install-prepare/best-practices/docker.html

1、新建/etc/docker/daemon.json,若有就不用新建了

2、添加log-dirver和log-opts参数,样例如下

在这里插入图片描述

"log-driver":"json-file","log-opts":{ "max-size" :"100m","max-file":"1"}

max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json

3、重启

sudo systemctl daemon-reloadsudo systemctl restart docker

这样就好啦,注意:只对新建的容器有效
参考资料:

https://docs.docker.com/engine/admin/logging/overview/#configure-the-logging-driver-for-a-container

===============================
清除大日志文件

在这里插入图片描述

容器日志一般存放在/var/lib/docker下面,可使用如下命令查看各个日志的文件大小

ls -lh $(find /var/lib/docker/containers/ -name *-json.log)

如何清理日志

如果docker容器正在运行,那么使用rm -rf 方式删除日志后,通过df -h会发现磁盘空间并没有释放

原因:在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用

正确姿势是cat /dev/null > *-json.log,当然你也可以通过rm删除后重启docker




六. 轻松搞定对容器实例日志设置定期清理和回卷

引言

Kubernetes对于容器实例的日志收集,并没有提供原生的解决方案。但提供使用 kubectl logs
命令查看容器实例运行时的日志。kubectl logs
命令实现的基本原理为:容器运行时默认将标准输出和标准错误中的日志输出到磁盘上保存。保存至主机目录:/var/lib/docker/containers/container_id/
目录。用户调用kubectl logs
命令时,kubelet
读取对应的日志文件中的数据,将数据回传给master,再由master返回到用户。从而实现用户对日志的查看。

腾讯云容器服务利用kubectl logs
命令,实现在控制台即可查看对应容器实例的日志,并且提供查看某个特定时间段的日志的功能,这极大的方便了用户对容器实例中的程序进行定位和跟踪。但是,由于在容器实例日志保存在本地,当程序中大量打印日志时,很容易造成主机上的磁盘空间大量被占用。在日志服务上线一段时间后,发现用户遇到这种情况时,一般是手动去清理日志。我们就考虑是不是有比较简单的方式,在集群节点对日志进行定期清理和回卷。

通过logrotate服务实现日志定期清理和回卷

logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。例如,你可以设置logrotate,让/var/log/foo日志文件每30天轮循,并删除超过6个月的日志。配置完后,logrotate的运作完全自动化,不必进行任何进一步的人为干预。

但如果按照之前的部署方式,需要手动在每个节点上都安装和配置对应logrotate工具。如果通过Kubernetes容器服务编排的能力,将logrotate通过Kubernetes中服务的方式部署到各个节点上,这样既可以实现只需要一次部署,部署到所有节点。并且通过容器的方式保证了logrotate配置的一致性。

具体的实施方案如下图所示:

在这里插入图片描述

logrotate方案

方案的具体实现是在Kubernetes集群中,创建DaemonSet资源实现。DaemonSet资源会在每个Node节点上都部署一个logrotate的容器实例,并且在容器实例中设置映射主机的log日志目录,从而实现日志的定时清理和回卷。

创建DaemonSet的示例如下:
apiVersion: extensions/v1beta1kind: DaemonSetmetadata:  name: logrotatespec:  template:    metadata:      labels:        app: logging        id: logrotate      name: logrotate    spec:      containers:      - name: logrotate-es        image: blacklabelops/logrotate        securityContext:          privileged: true        volumeMounts:         - name: containers           mountPath: /var/lib/docker/containers         - name: varlog           mountPath: /var/log/docker         - name: logs           mountPath: /logs        env:        - name: LOGS_DIRECTORIES          value: "/var/lib/docker/containers /var/log/docker"        - name: LOGROTATE_INTERVAL          value: "hourly"        - name: LOGROTATE_OLDDIR          value: "/logs"      volumes:         - hostPath:             path: /var/lib/docker/containers           name: containers         - hostPath:             path: /var/log/docker           name: varlog         - hostPath:             path: /var/log/containers/           name: logs

使用这个yaml文件,可以直接在Kubernetes中进行部署。

# kubectl create -f logrotate_ds.yamldaemonset "logrotate" created

在示例的yaml文件中,logrotate服务将按照定时(1小时)的对日志进行回卷,回卷超过5个副本后则会对日志进行清理。如果有需要,可以修改相应的参数,设置不同的回卷规则和清理规则。详细的参数说明可以参考:https://github.com/blacklabelops/logrotate。

通过修改dockerd参数进行回卷和清理

由于Kubernetes的日志收集,底层是通过docker来实现。而docker提供了一定的日志回卷和清理功能。可以通过在dockerd的启动参数中,增加log-opts()参数实现对日志的回卷和清理,其中max-size参数设置日志一个副本的最大值,max-file设置日志的最大的副本数。超过这个副本数则会对日志进行删除。

具体的修改过程包括三个步骤:
1、创建/etc/dockerd/daemon.json

{  "log-driver":"json-file",  "log-opts":{    "max-size" :"10m","max-file":"3"    }}

参数说明: 设置单个容器日志超过10M则进行回卷,回卷的副本数超过3个就进行清理。

2、修改dockerd 服务配置文件

在 /etc/systemd/system/multi-user.target.wants/dockerd.serviced文件中添加dockerd启动参数–config-file=/etc/docker/daemon.json

3、重新启动dockerd服务

systemctl daemon-reloadservice dockerd restart










惜鸟

docker标准输出日志存储位置,设置docker日志文件大小

Return HomeYatHo

Docker 日志都在哪里?怎么收集?

Locutus

Docker容器日志查看与清理(亲测有效)

程序猿青鸟

Docker容器日志清理

我和你并没有不同

docker日志设置定期清理

腾讯云开发者

轻松搞定对容器实例日志设置定期清理和回卷

本文链接:https://www.kjpai.cn/news/2024-04-27/162915.html,文章来源:网络cs,作者:康由,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论