当前位置: 首页 > 科技观察

微服务吐槽Nacos日志疯狂输出

时间:2023-03-16 12:44:37 科技观察

本文转载自微信公众号《程序新视野》,作者为二师兄。转载本文请联系程序新视界公众号。前言目前公司系统采用SpringCloud架构,其中服务注册和发现组件使用Nacos。最近运维抱怨磁盘不够,日志增长太快。经过简单排查,罪魁祸首竟然是Nacos。按理说Nacos作为服务注册中心,应该不会产生太多的日志,涉及的服务也不多,但是几天就产生1G多的日志,确实有点疯狂。本篇文章将讲讲Nacos的日志系统。查看事件背景后,输出最多的是{n??acos.home}/logs/access_log.yyyy-mm-dd.log格式的日志。日志包含了微服务系统调用Nacos的日志以及集群之间的通信,如心跳(/nacos/v1/ns/instance/beat)、服务列表获取(/nacos/v1/ns/instance/list)、状态检查(/nacos/v1/ns/service/status)等我们知道Nacos是基于SpringBoot实现的,access_log日志就是SpringBoot内置的Tomcat的访问日志。关于这个日志的配置,没有最长保留天数,也没有日志大小控制。而且NacosServer与各种服务直接心跳、获取、注册,会源源不断的产生访问日志。微服务越多,日志增长越快。这些日志打印会很快占用磁盘空间,造成资源浪费和运维成本。解决方案上面提到的access_log日志输出Nacos提供了一个控制开关。在Nacos的conf目录下的application.properties配置文件中,默认配置如下:#**************AccessLogRelatedConfigurations***************####Ifturnontheaccesslog:server.tomcat.accesslog.enabled=true###Theaccesslogpattern:server.tomcat.accesslog.pattern=%h%l%u%t"%r"%s%b%D%{用户-Agent}i%{Request-Source}i###Thedirectoryofaccesslog:server.tomcat.basedir=可以看到关闭了访问日志支持,日志输出格式和日志输出目录。在测试环境中,我们可以直接将enabled配置项设置为false,从而直接关闭日志的输出。server.tomcat.accesslog.enabled=false但是在生产环境中,这个操作有一定的风险。关闭后,生产中出现问题时,需要根据日志查看,不会找到对应的日志。这时只能通过其他方式处理,比如在Linux操作系统下写crontab来完成日志的定时删除。对应的脚本示例如下:#!/bin/bashlogFile="/data/nacos/bin/logs/nacos_del_access.log"#Retainlogsfor14daysdate=`date-d"$date-14day"+"%Y-%m-%d"`#具体位置可以调整delFilePath="/data/nacos/bin/logs/access_log.${date}.log"if[!-f"${logFile}"];thenecho'accesslog文件打印日志频繁。/etc/cron.daily/nacosDelAccessLogs.sh会定时删除访问日志文件'>>${logFile}fi#日志文件存在,删除if[-f"${delFilePath}"];thenrm-rf${delFilePath}curDate=`date--date='0daysago'"+%Y-%m-%d%H:%M:%S"`echo'['${curDate}']删除文件'${delFilePath}>>${logFile}fi问题虽然解决了,但是明显不够优雅,这也是NacosServer日志输出的问题之一。日志级别的动态调整关于NacosServer日志的输出级别,在1.1.3版本之前,也会打印大量的日志,没办法动态调整。该版本之后优化了日志输出,可以通过API调整日志级别。示例如下:#调整命名模块的naming-raft.log级别为error:curl-XPUT'$nacos_server:8848/nacos/v1/ns/operator/log?logName=naming-raft&logLevel=error'#调整config模块的config-dump.log级别为warn:curl-XPUT'$nacos_server:8848/nacos/v1/cs/ops/log?logName=config-dump&logLevel=warn'客户端日志集成客户端业务系统在1.1.3版本后也进行了优化,避免打印大量日志(主要涉及心跳日志、轮询日志等)。在业务系统的application.yml配置文件中,可以通过设置日志级别来控制:#loglevel,可以分配给具体的类logging:level:com.alibaba.nacos:warn也可以通过设置JVM启动时参数控制,默认为info级别:-Dcom.alibaba.nacos.naming.log.level=warn-Dcom.alibaba.nacos.config.log.level=warn以上例子指定了日志级别分别命名client和Configclient,适用于1.0.0及以上版本。更详细的日志配置查看conf目录下的nacos-logback.xml配置,会发现有很多与Nacos相关的日志配置项。如果由于项目原因需要更详细的配置,可以直接在该文件中进行配置。以naming-server对应的append配置为例,查看默认配置:${LOG_HOME}/naming-server.logtrue${LOG_HOME}/naming-server.log。%d{yyyy-MM-dd}.%i1GB77GBtrue/rollingPolicy>%date%level%msg%n%nUTF-8根据自己的需要,可以调整输出日志格式、日志文件分段、日志保留日期和日志压缩。总结Nacos的日志输出说了这么多。总的来说,相关日志输出过多,在灵活配置方面还有提升空间。基于目前的现状,我们可以通过自定义或者定时任务来完成日志的输出和管理。