9.8.2 日志管理与诊断方法

在 Nacos 运维中,日志是定位问题与还原链路的核心证据。本节聚焦“日志管理与诊断方法”,给出日志体系结构、采集配置、检索流程、典型排错与练习。

文章图片

1. 日志目录规划与安装落地示例#

目标:独立实例目录、日志统一采集、便于检索与保留。

# 假设 Nacos 安装路径 /opt/nacos
mkdir -p /data/nacos/{logs,conf,bin}
ln -s /opt/nacos/conf /data/nacos/conf

# 修改启动脚本指定日志目录(示例:/opt/nacos/bin/startup.sh)
# 增加 JVM 日志参数与日志输出路径
export JVM_OPT_EXT="-Xloggc:/data/nacos/logs/gc.log \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps \
-XX:ErrorFile=/data/nacos/logs/hs_err_pid%p.log"

# nacos.log 与业务日志默认在 /data/nacos/logs

预期效果/data/nacos/logs 下生成 nacos.log、config.log、naming.log、gc.log 等文件。

2. 日志级别与格式配置示例#

目标:结构化日志便于关联追踪。

# /data/nacos/conf/application.properties
# 调整日志级别
logging.level.com.alibaba.nacos=INFO
logging.level.com.alibaba.nacos.config=INFO
logging.level.com.alibaba.nacos.naming=INFO

# 当需要排错时临时开启 DEBUG
# logging.level.com.alibaba.nacos=DEBUG

建议字段:traceId、serviceName、clientIp、namespace、group、dataId
做法:通过日志平台解析或在应用侧补充 MDC(客户端)。

3. 日志滚动与保留策略#

<!-- /data/nacos/conf/nacos-logback.xml 示例片段 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  <fileNamePattern>/data/nacos/logs/nacos.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  <timeBasedFileNamingAndTriggeringPolicy
     class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
     <maxFileSize>200MB</maxFileSize>
  </timeBasedFileNamingAndTriggeringPolicy>
  <maxHistory>14</maxHistory>
</rollingPolicy>

预期效果:每天/按大小滚动,保留 14 天。

4. 关键日志检索命令与解释#

# 1) 查配置发布失败记录
grep -n "Publish config failed" /data/nacos/logs/config.log

# 2) 查服务实例推送失败
grep -n "push failed" /data/nacos/logs/naming.log

# 3) 查鉴权失败
grep -n "AUTH FAIL" /data/nacos/logs/nacos.log

# 4) 按时间窗过滤(示例:2024-01-19 10:00-10:30)
awk '$1" "$2 >= "2024-01-19 10:00" && $1" "$2 <= "2024-01-19 10:30"' \
/data/nacos/logs/config.log

解释
- grep -n 带行号,便于定位上下文。
- awk 按时间字段过滤,减少日志扫描成本。

5. 典型场景排错示例#

5.1 配置变更未生效#

# 1) 查 config.log 中是否有发布成功记录
grep -n "Publish config" /data/nacos/logs/config.log

# 2) 查客户端是否收到推送
grep -n "receive config" /path/to/client.log

判断:若服务端无发布记录,排查控制台权限或 API 调用;若发布成功但客户端无接收,检查网络/长轮询超时。

5.2 注册发现异常#

# 1) 查注册与心跳
grep -n "register instance" /data/nacos/logs/naming.log
grep -n "heartbeat" /data/nacos/logs/naming.log

# 2) 查服务列表推送失败
grep -n "push failed" /data/nacos/logs/naming.log

判断:心跳缺失可能为客户端网络问题;推送失败可能为连接池耗尽或线程池满。

5.3 鉴权失败#

grep -n "AUTH FAIL" /data/nacos/logs/nacos.log
grep -n "token" /path/to/client.log

判断:token 过期或权限未授权,核对 namespace 与 role。

6. JVM/系统级诊断示例#

# 查看 GC 停顿
grep -n "Full GC" /data/nacos/logs/gc.log

# 查看线程堆栈(需 jstack)
jstack -l $(pgrep -f nacos) > /data/nacos/logs/jstack.$(date +%F_%H%M).log

# 资源瓶颈检查
top -H -p $(pgrep -f nacos)
iostat -x 1 5

判断:频繁 Full GC 或磁盘写入阻塞会导致配置推送延迟。

7. 集中式日志采集示例(Filebeat)#

# /etc/filebeat/filebeat.yml
filebeat.inputs:
  - type: log
    paths:
      - /data/nacos/logs/nacos.log
      - /data/nacos/logs/config.log
      - /data/nacos/logs/naming.log
    fields:
      service: nacos
      env: prod
output.elasticsearch:
  hosts: ["http://10.0.0.10:9200"]
setup.kibana:
  host: "http://10.0.0.11:5601"

预期效果:日志进入 ES,可按 dataId/serviceName/namespace 检索并告警。

8. 练习:从日志定位一次配置推送失败#

任务:模拟一次配置推送失败并定位原因。
步骤
1. 在控制台发布配置,临时关闭客户端网络(或停止客户端)。
2. 执行:

grep -n "Publish config" /data/nacos/logs/config.log
grep -n "client not connected" /data/nacos/logs/config.log
  1. 写出结论:服务端发布成功,但客户端离线导致推送失败。

9. 诊断流程模板(SOP)#

1) 问题描述
2) 时间窗与影响范围
3) 关键日志证据(服务端+客户端)
4) 根因分析
5) 修复与验证
6) 复盘改进与关键告警词更新