nacos作为注册中心,naming模块是其实现的主要位置,这里发现其日志实现比较有特色,简单讲一下。
一.日志类
模块位置如下:
不同的模块使用不通的日志路径做区分,直接上代码,
public class Loggers {
public static final Logger PUSH = LoggerFactory.getLogger("com.alibaba.nacos.naming.push");
public static final Logger CHECK_RT = LoggerFactory.getLogger("com.alibaba.nacos.naming.rt");
public static final Logger SRV_LOG = LoggerFactory.getLogger("com.alibaba.nacos.naming.main");
public static final Logger EVT_LOG = LoggerFactory.getLogger("com.alibaba.nacos.naming.event");
public static final Logger RAFT = LoggerFactory.getLogger("com.alibaba.nacos.naming.raft");
public static final Logger DISTRO = LoggerFactory.getLogger("com.alibaba.nacos.naming.distro");
public static final Logger PERFORMANCE_LOG = LoggerFactory.getLogger("com.alibaba.nacos.naming.performance");
public static void setLogLevel(String logName, String level) {
switch (logName) {
case "naming-push":
((ch.qos.logback.classic.Logger) PUSH).setLevel(Level.valueOf(level));
break;
case "naming-rt":
((ch.qos.logback.classic.Logger) CHECK_RT).setLevel(Level.valueOf(level));
break;
case "naming-server":
((ch.qos.logback.classic.Logger) SRV_LOG).setLevel(Level.valueOf(level));
break;
case "naming-event":
((ch.qos.logback.classic.Logger) EVT_LOG).setLevel(Level.valueOf(level));
break;
case "naming-raft":
((ch.qos.logback.classic.Logger) RAFT).setLevel(Level.valueOf(level));
break;
case "naming-distro":
((ch.qos.logback.classic.Logger) DISTRO).setLevel(Level.valueOf(level));
break;
case "naming-performance":
((ch.qos.logback.classic.Logger) PERFORMANCE_LOG).setLevel(Level.valueOf(level));
break;
default:
break;
}
}
}
二.日志级别动态控制
后面通过暴漏的controller接口控制每个的日志的等级
@RequestMapping("/nacos/v1/ns/operator")
public Class OperatorController {
@PutMapping("/log")
public String setLogLevel(@RequestParam String logName, @RequestParam String logLevel) {
Loggers.setLogLevel(logName, logLevel);
return "ok";
}
}
通过这种方式可以控制某个模块下日志的打印级别,方便在排查问题的时候动态的调整日志的输出级别。