nacos-naming 模块日志设计实现及思想

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";
    	}
	}

通过这种方式可以控制某个模块下日志的打印级别,方便在排查问题的时候动态的调整日志的输出级别。

运行nacos服务报错: Error creating bean with name 'instanceOperatorClientImpl' defined in URL [jar:file:/D:/Java/Teacher/cc/璧勬枡/4銆丼pringCloud%20Alibaba/nacos/target/nacos-server.jar!/BOOT-INF/lib/nacos-naming-2.0.1.jar!/com/alibaba/nacos/naming/core/InstanceOperatorClientImpl.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'clientOperationServiceProxy' defined in URL [jar:file:/D:/Java/Teacher/cc/璧勬枡/4銆丼pringCloud%20Alibaba/nacos/target/nacos-server.jar!/BOOT-INF/lib/nacos-naming-2.0.1.jar!/com/alibaba/nacos/naming/core/v2/service/ClientOperationServiceProxy.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'persistentClientOperationServiceImpl' defined in URL [jar:file:/D:/Java/Teacher/cc/璧勬枡/4銆丼pringCloud%20Alibaba/nacos/target/nacos-server.jar!/BOOT-INF/lib/nacos-naming-2.0.1.jar!/com/alibaba/nacos/naming/core/v2/service/impl/PersistentClientOperationServiceImpl.class]: Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.alibaba.nacos.naming.core.v2.service.impl.PersistentClientOperationServiceImpl]: Constructor threw exception; nested exception is java.lang.IllegalStateException: Fail to init node, please see the logs to find the reason.如何解决
07-13
在运行 Nacos 服务时,如果遇到类似 `Error creating bean with name 'instanceOperatorClientImpl'` 或 `Error creating bean with name 'clientOperationServiceProxy'` 的错误提示,则通常与 Spring 容器初始化 Bean 的过程出现问题有关。以下是一些可能的原因及对应的解决方案: ### 1. 检查依赖库是否完整 Nacos 启动过程中需要加载多个内部模块和 Spring Bean,若某些依赖 JAR 文件缺失或损坏,会导致 Bean 创建失败。请确保: - 使用的 Nacos 包是官方发布的完整版本; - 所有依赖文件未被手动修改或删除; - 如果使用的是源码构建方式,请重新执行 Maven 构建命令以下载所有依赖: ```bash mvn -Prelease-nacos clean install -U ``` ### 2. 数据库配置问题 若 Nacos 配置为使用外部数据库(如 MySQL),Bean 初始化失败可能是由于数据库连接异常导致。请检查: - 数据库是否正常运行; - 数据库连接信息(URL、用户名、密码)是否正确; - 数据库表结构是否已按照 [Nacos 官方文档](https://github.com/alibaba/nacos/blob/develop/config/src/main/resources/sql/schema.sql) 正确初始化。 ### 3. 网络或端口冲突 某些 Bean(如 `clientOperationServiceProxy`)涉及远程通信或本地服务注册。如果本地端口被占用或网络配置不当,可能导致服务启动失败。建议: - 检查 `application.properties` 中配置的端口(默认 `8848`)是否被占用; - 若启用了集群模式,请确认各节点之间的网络连通性; - 查看日志中是否有 `java.net.BindException` 或连接超时等信息。 ### 4. JVM 参数或版本不兼容 Nacos 推荐使用 Java 8 或 Java 11,并且部分功能对 JVM 参数有特定要求。请确认: - 使用的 JDK 版本符合要求; - 启动脚本中设置的 JVM 参数无误,例如 `-Xms` 和 `-Xmx` 建议不低于 `512m`; - 对于 Windows 系统,可尝试安装 [Visual C++ 2015 可再发行组件](https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=48145) 以避免底层依赖问题[^2]。 ### 5. 清理缓存并重启 Nacos 在运行过程中会生成临时文件和缓存数据,有时这些数据可能会导致启动异常。可以尝试: - 删除 `data` 目录下的缓存文件; - 删除 `logs/start.out` 日志文件以便重新生成清晰的日志- 再次启动服务观察是否仍报错。 ### 6. 查阅详细日志定位问题 Spring Bean 初始化失败时,通常会在日志中打印出更详细的异常堆栈信息。请查看 `logs/start.out` 文件,找到具体的错误原因,例如类找不到、方法签名不匹配、配置项缺失等。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值