微服务之吐槽一下Nacos日志的疯狂输出

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 微服务之吐槽一下Nacos日志的疯狂输出

前言

目前公司系统采用Spring Cloud架构,其中服务注册和发现组件用的Nacos,最近运维抱怨说,磁盘不够用,日志增长的太快。简单排查一下,罪魁祸首竟然是Nacos。


按理说Nacos作为服务注册中心,不会应该会产生太多日志的,本身涉及的服务也不多,但几天就会产生1G以上的日志,的确有点疯狂。这篇文章就聊聊Nacos的日志系统。


事件背景

经过排查,其中输出最多的日志为{nacos.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是基于Spring Boot实现的,access_log日志是Spring Boot内置的Tomcat的访问日志。关于该项日志的配置,没有保留最大天数,也没有日志大小的控制。而且随着Nacos Server与各个服务直接的心跳、获取、注册等会不停的产生访问日志,微服务越多,日志增长越快。这些日志打印会迅速占用完磁盘空间,带来资源浪费和运维成本。


解决方案

上述的access_log日志输出Nacos是提供了控制开关的,在Nacos的conf目录下application.properties配置文件中,默认有以下配置:


#*************** Access Log Related Configurations ***************#
### If turn on the access log:
server.tomcat.accesslog.enabled=true
### The access log pattern:
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
### The directory of access log:
server.tomcat.basedir=

可以看到,关于访问日志支持关闭、日志输出格式以及日志输出的目录。


在测试环境,我们可以直接将enabled的配置项设置为false,直接关闭该日志的输出。


server.tomcat.accesslog.enabled=false

1

但在生产环境,这样操作就有一定的风险了。当关闭之后,生产出现问题时需要根据日志进行排查,就会找不到对应的日志。


此时,只能通过其他方式进行处理,比如在Linux操作系统下通过编写crontab来完成日志的定时删除。对应的脚本示例如下:


#!/bin/bash
logFile="/data/nacos/bin/logs/nacos_del_access.log"
# 保留14天日志
date=`date -d "$date -14 day" +"%Y-%m-%d"`
# 具体位置可调整
delFilePath="/data/nacos/bin/logs/access_log.${date}.log"
if [ ! -f "${logFile}" ];then
  echo 'access log文件打印日志频繁. /etc/cron.daily/nacosDelAccessLogs.sh 会定时删除access日志文件' >>${logFile}
fi
# 日志文件存在, 则删除
if [  -f "${delFilePath}" ];then
  rm -rf ${delFilePath}
  curDate=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"`
  echo '['${curDate}'] 删除文件'${delFilePath} >>${logFile}
fi

虽然问题解决了,但很明显并不优雅,这也是Nacos Server日志输出的问题之一。


日志级别动态调整

关于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'

1

2

3

4

客户端日志

业务系统集成的客户端在1.1.3版本之后,也进行了优化,避免日志大量打印(主要涉及心跳日志、轮询日志等)。


在业务系统的application.yml配置文件中,可通过日志级别设置来进行控制:


# 日志级别,可以指定到具体类

logging:

 level:

   com.alibaba.nacos: warn

1

2

3

4

也可以通过启动时的JVM参数来进行控制,默认是info级别:


-Dcom.alibaba.nacos.naming.log.level=warn -Dcom.alibaba.nacos.config.log.level=warn

1

上述示例分别指定了Naming客户端和Config客户端的日志级别,适用于1.0.0及以上版本。


更细的日志配置

查看conf目录下的nacos-logback.xml配置,你会发现Nacos相关的日志配置项非常多,如果因项目需要进行更精细化的配置,可在此文件中进行直接配置。


以naming-server对应的append配置为例,看一下默认的配置:


<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>

这里根据自己的需要,可调整输出的日志格式、日志文件分割、日志保留日期及日志压缩等处理。

小结

关于Nacos的日志输出就聊这么多,整体而言相关的日志输出有些过于多了,而且在灵活配置方面还有待提升。基于目前的现状我们可以通过自定义或定时任务等配合完成日志输出与管理。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6月前
|
网络协议 Nacos 数据安全/隐私保护
MSE微服务引擎注册问题之nacos注册失败如何解决
MSE(MicroService Engine)微服务引擎是阿里云提供的一种微服务治理平台,它通过提供服务注册、发现、配置管理等功能来支撑微服务架构的稳定运行;本合集旨在梳理MSE微服务引擎的核心特性、部署流程,以及实践中可能遇到的问题和相应的解决方案,以助力用户优化微服务架构的实施和管理。
|
Kubernetes 应用服务中间件 Nacos
【实战】K8S部署Nacos微服务(3)
【实战】K8S部署Nacos微服务(3)
1077 0
【实战】K8S部署Nacos微服务(3)
|
3月前
|
Cloud Native Java Nacos
微服务注册中心-Nacos概述
该博客文章提供了对Nacos的全面概述,包括其基本介绍、与Spring Cloud集成的优势、主要功能以及如何在Spring Cloud Alibaba项目中作为服务注册中心使用Nacos。文章解释了Nacos是一个动态服务发现、配置管理和服务管理平台,支持服务发现、健康监测、动态配置、DNS服务和元数据管理。还介绍了如何下载和启动Nacos服务器,以及如何将微服务注册到Nacos中,包括修改pom.xml文件引入依赖、配置application.properties文件和使用@EnableDiscoveryClient注解开启服务注册发现功能。
微服务注册中心-Nacos概述
|
6月前
|
Kubernetes Nacos 微服务
nacos常见问题之v2.2.3 k8s 微服务注册nacos强制删除 pod不消失如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
179 1
nacos常见问题之v2.2.3 k8s 微服务注册nacos强制删除 pod不消失如何解决
|
6月前
|
负载均衡 网络协议 数据管理
深入解析Nacos:服务发现、配置管理与更多特性解析
深入解析Nacos:服务发现、配置管理与更多特性解析
729 0
|
存储 Nacos 开发工具
微服务配置中心(Nacos Config)
微服务配置中心(Nacos Config)
385 0
|
负载均衡 关系型数据库 MySQL
09-微服务技术栈(基础):Nacos配置中心
上一节我们借助于Nacos实现注册中心,完美替换了Eureka在项目之初的功能,开始本章节之前我们一起回忆下Nacos实现注册中心的关键步骤 1. 引入springcloud-alibaba/nacos-discovery依赖 2. 去除原eureka依赖、去除配置文件中eureka注册信息 3. 新增nacos注册信息:spring.cloud.nacos.server-addr:localhost:8848 4. 重启项目并验证 在此基础之上我们验证了Nacos的负载均衡策略、权重控制、环境隔离等信息,希望大家还能有点印象。
457 0
|
前端开发 Java 测试技术
微服务系列:nacos配置中心实战
微服务系列:nacos配置中心实战
653 1
微服务系列:nacos配置中心实战
|
缓存 Java Nacos
微服务系列:nacos注册中心实战
微服务系列:nacos注册中心实战
188 0
微服务系列:nacos注册中心实战
下一篇
无影云桌面