按理说 Nacos 作为服务注册中心,不会应该会产生太多日志的,本身涉及的服务也不多,但几天就会产生 1G 以上的日志,的确有点疯狂。这篇文章就聊聊 Nacos 的日志系统。
经过排查,其中输出最多的日志为 /usr/local/nacos/bin/logs/access_log.yyyy-mm-dd.log 格式的日志。日志中包含了微服务系统调用 Nacos 及集群之间通信的日志,比如心跳 (/nacos/v1/ns/instance/beat) 、获取服务列表 (/nacos/v1/ns/instance/list) 、状态检查 (/nacos/v1/ns/service/status) 等。
我们知道 Nacos 是基于 Spring Boot 实现的,access_log 日志是 Spring Boot 提内置的Tomcat的访问日志。关于该项日志的配置,没有保留最大天数,也没有日志大小的控制。而且随着 Nacos Server 与各个服务直接的心跳、获取、注册等会不停的产生访问日志,微服务越多,日志增长越快。这些日志打印会迅速占用完磁盘空间,带来资源浪费和运维成本。
一、生产环境
1.编写脚本文件
脚本一
#!/bin/bash
# 输出日志位置
logFile="/opt/payment/soft/nacos/nacos/bin/logs/nacos_del_access.log"
# 保留7天日志
dateLog=`date -d "-7 day" +%Y-%m-%d`
# 具体位置可调整
delFilePath="/opt/payment/soft/nacos/nacos/bin/logs/access_log.${dateLog}.log"
# 日志文件存在,则删除
if [ -f "${delFilePath}" ];then
rm -rf ${delFilePath}
curDate=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"`
echo '['${curDate}'] 删除文件'${delFilePath} >>${logFile}
fi
脚本二
#!/bin/sh
############################
#$1 nacos home
#$2 log save days
#############################
logs_path=$1
savedays=$2
echo $(date)-----------------clean >> ./nacosClean.log
#清理logs文件夹下的access.log文件
delList=$(find $logs_path/logs/ -mtime +$savedays -name "access_log.*.log")
#echo $delList >> ./nacosClean.log
for i in $delList
do
rm -rf $i
echo $i>>./nacosClean.log
done
#清理bin文件夹下的access.log文件
delList=$(find $logs_path/bin/logs/ -mtime +$savedays -name "access_log.*.log")
#echo $delList >> ./nacosClean.log
for i in $delList
do
rm -rf $i
echo $i>>./nacosClean.log
done
#清理logs文件夹下的其它文件
delList=$(find $logs_path/logs/ -mtime +$savedays -name "*.log.*")
#echo $delList >> ./nacosClean.log
for i in $delList
do
rm -rf $i
echo $i>>./nacosClean.log
done
2.赋权限
chmod 755 nacosDelAccessLogs.sh
3.添加或更新linux系统中crontab指令
添加 crontab -e
查看 crontab -l
删除 crontab -r
4.添加定时执行指令
0 23 * * * /usr/local nacosDelAccessLogs.sh (23点执行脚本)
crontab表达式可自行百度查询
5.启动服务
①第一种
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看状态
②第二种
systemctl start crond.service //启动服务
systemctl stop crond.service //关闭服务
systemctl restart crond.service //重启服务
systemctl reload crond.service //重新载入配置
systemctl status crond.service //查看状态
其他优化方式:
1、日志级别动态调整
关于 Nacos Server 日志的输出级别,在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'
2、客户端日志级别调整
业务系统集成的客户端在1.1.3版本之后,也进行了优化,避免日志大量打印(主要涉及心跳日志、轮询日志等)。
在业务系统的application.yml配置文件中,可通过日志级别设置来进行控制:
# 日志级别,可以指定到具体类
logging:
level:
com.alibaba.nacos: warn
3、JVM参数控制
也可以通过启动时的JVM参数来进行控制,默认是info级别:
-Dcom.alibaba.nacos.naming.log.level=warn -Dcom.alibaba.nacos.config.log.level=warn
上述示例分别指定了Naming客户端和Config客户端的日志级别,适用于1.0.0及以上版本。
4、nacos日志文件nacos-logback.xml配置
<appender name="naming-server"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/naming-server.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/naming-server.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
<maxFileSize>1GB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>7GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%date %level %msg%n%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
这里根据自己的需要,可调整输出的日志格式、日志文件分割、日志保留日期及日志压缩等处理。
二、测试环境
1.修改配置
上述的 access_log 日志输出 Nacos 是提供了控制开关的,在 Nacos 的 conf 目录下 application.properties 配置文件中,默认有以下配置:
server.tomcat.accesslog.enabled=false