微服務之吐槽一下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的日志輸出就聊這么多,整體而言相關的日志輸出有些過于多了,而且在靈活配置方面還有待提升。基于目前的現狀我們可以通過自定義或定時任務等配合完成日志輸出與管理。