问题背景:

我们现在项目的 Nacos 由于需要适配 Oracle 数据库所以在 Github 仓库中拉取的 Nacos 多数据源分支的源码,此分支的 Nacos 版本为 1.4.1,部署方式是通过 Dockerfile 打包为镜像通过容器运行在服务器上。领导告知我开发服务器上有一天磁盘被占满,通过排查下来发现是 Nacos 容器日志占用了大量的磁盘空间,让我处理一下,就有了今天这篇文章复盘。

导致原因:

通过 docker exec 命令进入容器后,发现日志文件主要集中在两个目录下,一个是 /logs,一个是 /root/nacos/logs 目录。

通过查看官方文档中的 FAQ(常见问题解答) 搜索 “日志” 关键词,看到有一个 日志打印频繁的问题 的标题,写道:

在老的Nacos版本中,往往会有大量的无效日志打印,这些日志的打印会迅速占用完用户的磁盘空间,同时也让有效日志难以查找。目前社区反馈的日志频繁打印主要有以下几种情况:

  1. access日志大量打印,相关issue有:https://github.com/alibaba/nacos/issues/1510。主要表现是{nacos.home}/logs/access_log.2019-xx-xx.log类似格式文件名的日志大量打印,而且还不能自动清理和滚动。这个日志是Spring Boot提供的tomcat访问日志打印,Spring Boot在关于该日志的选项中,没有最大保留天数或者日志大小控制的选项。因此这个日志的清理必须由应用新建crontab任务来完成,或者通过以下命令关闭日志的输出(在生产环境我们还是建议开启该日志,以便能够有第一现场的访问记录):
server.tomcat.accesslog.enabled=false
  1. 服务端业务日志大量打印且无法动态调整日志级别。这个问题在1.1.3已经得到优化,可以通过API的方式来进行日志级别的调整,调整日志级别的方式如下:
# 调整naming模块的naming-raft.log的级别为error:
curl -X PUT '$nacos_server:8848/nacos/v1/ns/operator/log?logName=naming-raft&logLevel=error'
# 调整config模块的config-dump.log的级别为warn:
curl -X PUT '$nacos_server:8848/nacos/v1/cs/ops/log?logName=config-dump&logLevel=warn'
  1. 客户端日志大量打印,主要有心跳日志、轮询日志等。这个问题已经在1.1.3解决,请升级到1.1.3版本。

由此可知,/logs 目录下存储的是tomcat访问日志,/root/nacos/logs 目录存储的是 Nacos 自身运行记录的一些日志(心跳、服务轮询、推送等)。

解决方案:

1、修改 Nacos console 模块的配置文件 /console/src/main/resources/application.properties,将tomcat访问日志关闭。

server.tomcat.accesslog.enabled=false

2、通过查阅资料得知,Nacos 自身服务器的日志打印设置在 nacos-distribution 模块下的 distribution/conf/nacos-logback.xml中。

<!--节选naming-push.log的配置信息-->
<appender name="naming-push"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>${LOG_HOME}/naming-push.log</file>
  <append>true</append>
  <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <fileNamePattern>${LOG_HOME}/naming-push.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
    <maxFileSize>1GB</maxFileSize>
    <maxHistory>7</maxHistory>
    <totalSizeCap>3GB</totalSizeCap>
    <cleanHistoryOnStart>true</cleanHistoryOnStart>
  </rollingPolicy>
  <encoder>
    <Pattern>%date %level %msg%n%n</Pattern>
    <charset>UTF-8</charset>
  </encoder>
</appender>	

Nacos 自身 30+ 个日志的配置都在这个日志配置文件中,可以看到 naming-push.log 日志单个文件最大大小为 1GB,总大小为 3GB ,最多保存 7 日内的日志文件,按最大大小 3GB 来算, 30个日志文件配置每个日志都占用最大的磁盘空间,那就是 3 * 30 = 90GB,何况还有好几个文件最大的日志总大小为 7GB,所以光日志就能占用 100 多GB的磁盘空间。所以我通过我们服务器的磁盘空间和日志的重要程度评估,将所有配置日志文件的占用大小一一修改,使得 Nacos 自身日志总占用空间最多不超过 5G。至此解决了 Nacos 日志占用磁盘空间过大的问题。

其它:

有的公司 Nacos 是使用 zip 包的方式通过 sh 文件启动,我也下了一个,需要修改的配置文件位置我用图贴出来,按照上方的配置方式修改箭头指向的文件内配置即可。

还有直接用 Docker 拉取的官方镜像 run 的,也是同样的方式,换汤不换药,进入容器找到这两个配置文件修改。

网上有很多博客解决 Nacos 日志过大的方式是通过 Linux crond 执行清理脚本的方式,这种方式当然也可以,但如果不需要查看日志文件的话,使用我这种直接关闭 tomcat 访问日志,减小 Nacos 服务器日志最大占用空间的方式更加稳定。