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

本文涉及的产品
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 微服务之吐槽一下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

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

此时,只能通过其他方式进行处理,比如在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.1.3版本之后,也进行了优化,避免日志大量打印(主要涉及心跳日志、轮询日志等)。

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

# 日志级别,可以指定到具体类
logging:
  level:
    com.alibaba.nacos: warn

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

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

上述示例分别指定了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的日志输出就聊这么多,整体而言相关的日志输出有些过于多了,而且在灵活配置方面还有待提升。基于目前的现状我们可以通过自定义或定时任务等配合完成日志输出与管理。

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
3月前
|
人工智能 安全 Nacos
Nacos 3.0:微服务与AI融合的技术新纪元
Nacos 3.0:微服务与AI融合的技术新纪元
242 83
|
3月前
|
人工智能 安全 Java
Nacos 3.0:从微服务治理到AI服务治理的跃迁
Nacos 3.0:从微服务治理到AI服务治理的跃迁
226 5
|
3月前
|
人工智能 自然语言处理 安全
Nacos 3.0:微服务与AI融合的新一代动态治理平台
Nacos 3.0:微服务与AI融合的新一代动态治理平台
243 2
|
28天前
|
Prometheus 监控 Java
日志收集和Spring 微服务监控的最佳实践
在微服务架构中,日志记录与监控对系统稳定性、问题排查和性能优化至关重要。本文介绍了在 Spring 微服务中实现高效日志记录与监控的最佳实践,涵盖日志级别选择、结构化日志、集中记录、服务ID跟踪、上下文信息添加、日志轮转,以及使用 Spring Boot Actuator、Micrometer、Prometheus、Grafana、ELK 堆栈等工具进行监控与可视化。通过这些方法,可提升系统的可观测性与运维效率。
105 1
日志收集和Spring 微服务监控的最佳实践
|
3月前
|
人工智能 自然语言处理 Nacos
Nacos 3.0:微服务与AI融合的全新治理平台
Nacos 3.0:微服务与AI融合的全新治理平台
212 46
|
7月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
777 0
|
11月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
551 6
|
11月前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
254 1