小心生产事故:如何查看docker日志位置并清空
最近生产linux服务器有点问题,顺便看了下磁盘空间,居然马上就100%了,非常危险。如果磁盘爆满,感觉服务一定会出问题。于是赶紧找了找运行中的java中的日志,看看是否需要清理;发现并不是java日志的问题,java日志配置了,只保存2个月的日志的功能(相当于自带定期清理),检查了文件大小,并不是占用最多的。然后从根目录下,一层一层找,占用空间最多的文件,最后终于发现,是docker日志的问题。
一、前言
最近生产linux服务器有点问题,顺便看了下磁盘空间,居然马上就100%了,非常危险。如果磁盘爆满,感觉服务一定会出问题。
//查看磁盘空间命令
df -h

这个`/dev/xvda1`就是当前磁盘占用,之前清理过一次,写文章的时候又到54%了。
于是赶紧找了找运行中的java中的日志,看看是否需要清理;发现并不是java日志的问题,java日志配置了,只保存2个月的日志的功能(相当于自带定期清理),检查了文件大小,并不是占用最多的。
然后从根目录下,一层一层找,占用空间最多的文件,最后终于发现,是docker日志的问题。
二、如何查看docker日志位置并清空
1.先查看运行中docker有哪些,找到id
docker ps

2.使用id,查看docker配置文件,并用grep筛选到日志位置
//075098ae7f30 需要换成自己的docker id
docker inspect 075098ae7f30 | grep LogPath

注意,路径很长,画圈位置是路径。
3.进入日志位置,可以看下当前日志占用大小
cd /var/lib/docker/containers/075098ae7f3037e3bc7fd582d5eb716eb0cd348a73fc35f8418185c99377bc78
du -sh *

左边大小,右边那个json.log就是docker日志文件,可以看到占用了104G了,太大了。
4.如果不放心,可以确认下这个文件到底是不是日志文件
tail -200f 075098ae7f3037e3bc7fd582d5eb716eb0cd348a73fc35f8418185c99377bc78-json.log
这个命令可以显示最后200行文件内容。
5.清空日志文件
直接删除文件不太好,担心万一程序找不到文件报错;一般都是直接改文件内容来清空:
echo '' > 075098ae7f3037e3bc7fd582d5eb716eb0cd348a73fc35f8418185c99377bc78-json.log
这个命令可以把空字符串写入文件,替换原有内容,就清空了。
6.可以再次确认下,文件确实清空了,服务器大小好了很多。

之前54%占用,现在33%占用;文件之前104G,现在4.0K。
三、追记
这个服务器上,java进程在docker里面执行。
java自己打印的日志配置了定期清理,只保留2个月的;
但是docker为什么也会打印这么多日志,按理说java打印就够了,docker不用打印日志的。(不然docker的日志还得定期清理,很麻烦)
后来发现,是因为java打印到控制台的日志,docker就会记录成自己的日志打印出来。
java已经自己生成日志文件了,没必要docker再记录一份,重复。
解决方法就是,java不要打印到控制台。
样例如下:
<!-- 这一段,class用的是ConsoleAppender,负责打印控制台的 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 这一段注释掉,意思就是info级别的日志,不采用name=console的配置,就是不采用打印控制台的配置,就不会答应控制台了 -->
<!-- <root level="info">
<appender-ref ref="console" />
</root>-->
本人项目用的是logback.xml配置的日志打印;
把打印控制台的配置注释掉,就不会打印控制台了,docker的日志就能少很多。
更多推荐
所有评论(0)