【Dubbo3高级特性】「实战开发」适配日志框架并支持运行时动态切换使用的日志框架开发实战

news2024/11/19 23:11:41

日志框架适配及运行时管理

本节内容主要是针对于如何在Dubbo中适配日志框架并支持运行时动态切换使用的日志框架,首先前提是需要进行启动我们Dubbo服务的Qos服务,它主要用于作为我们的操作对应的日志切换的功能实现机制

特性说明

日志框架适配,自 2.2.1 开始,dubbo 开始内置 log4j、slf4j、jcl、jdk 这些日志框架的适配,根据不同的实现,采用SPI模式进行实现对应的类,对适配器集合的方法所示。

slf4j=org.apache.dubbo.common.logger.slf4j.Slf4jLoggerAdapter
jcl=org.apache.dubbo.common.logger.jcl.JclLoggerAdapter
log4j=org.apache.dubbo.common.logger.log4j.Log4jLoggerAdapter
jdk=org.apache.dubbo.common.logger.jdk.JdkLoggerAdapter
log4j2=org.apache.dubbo.common.logger.log4j2.Log4j2LoggerAdapter

日志框架运行时管理,自 3.0.10 开始,dubbo-qos 运行时管控支持查询日志配置以及动态修改使用的日志框架和日志级别。通过 dubbo-qos 修改的日志配置不进行持久化存储,在应用重启后将会失效。

开启Qos模式服务

在这里我们使用API模式进行配置展示

ServiceConfig<T> service = new ServiceConfig<>();
// 设置对应的Application应用配置
ApplicationConfig applicationConfig = new ApplicationConfig("ProviderBoostrap");
// 配置Qos的配置机制
ApplicationConfig applicationConfig = new ApplicationConfig("ProviderBoostrap");
applicationConfig.setQosEnable(true);
applicationConfig.setQosPort(2222);
applicationConfig.setQosHost("127.0.0.1");
applicationConfig.setQosEnableCompatible(Boolean.TRUE);
service.setApplication(applicationConfig);
// 设置注册中心
service.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":" + zookeeperPort));
service.setInterface(clazz);
service.setRef((T)clazzImpl.newInstance());
service.export();

登录Qos模式服务

>telnet 127.0.0.1 22222

在这里插入图片描述

查询日志配置

官方文档说的这个命令:loggerInfo,其实本身再很多版本是不兼容的所以暂时不可用的。
在这里插入图片描述
>help
在这里插入图片描述
通过help指令查看所有的指令操作,而主要又两个与日志相关的功能指令:

  • switchLogLevel:主要用于调整日志级别的指令方法
  • switchLogger:主要用于调整日志框架类型的指令方法

所以主要又两种方法进行修改设置日志级别和日志框架类型

静态设置和动态设置

静态设置

日志框架适配,可以通过以下方式显式配置日志输出策略

JVM命令行设置日志框架
java -Ddubbo.application.logger=log4j
dubbo.properties 中指定
dubbo.application.logger=log4j
xml 中配置
<dubbo:application logger="log4j" />
application.yml中配置
dubbo:
  application:
  	logger: log4j

在这里插入图片描述

实战延时效果

jdk的框架效果

在这里插入图片描述

jcl的框架效果

在这里插入图片描述

sl4fj的框架效果

在这里插入图片描述

log4j2的框架效果

在这里插入图片描述
其他的类型暂时不展示了效果差不多的。除了这几种类型之外,还可以自己扩展log日志框架的实现功能。

动态设置

自定义扩展可以参考 日志适配扩展

修改日志级别

命令:switchLogLevel {level}

level: ALL, TRACE, DEBUG, INFO, WARN, ERROR, OFF
示例

> telnet 127.0.0.1 22222
> switchLogLevel INFO

输出

在这里插入图片描述

日志适配扩展

日志输出适配扩展点。

扩展接口

org.apache.dubbo.common.logger.LoggerAdapter

扩展配置

<dubbo:application logger="xxx" />

或者:

-Ddubbo:application.logger=xxx

已知扩展

org.apache.dubbo.common.logger.slf4j.Slf4jLoggerAdapter
org.apache.dubbo.common.logger.jcl.JclLoggerAdapter
org.apache.dubbo.common.logger.log4j.Log4jLoggerAdapter
org.apache.dubbo.common.logger.log4j2.Log4j2LoggerAdapter
org.apache.dubbo.common.logger.jdk.JdkLoggerAdapter

扩展示例

Maven 项目结构:
src
 |-main
    |-java
        |-com
            |-xxx
                |-XxxLoggerAdapter.java (实现LoggerAdapter接口)
    |-resources
        |-META-INF
            |-dubbo
                |-org.apache.dubbo.common.logger.LoggerAdapter (纯文本文件,内容为:xxx=com.xxx.XxxLoggerAdapter)
CustomerLoggerAdaptor .java:
public class CustomerLoggerAdaptor implements org.apache.dubbo.common.logger.LoggerAdapter {

    @Override
    public Logger getLogger(Class<?> key) {
        return new CustomerLogger();
    }

    @Override
    public Logger getLogger(String key) {
        return new CustomerLogger();
    }

    @Override
    public Level getLevel() {
        return null;
    }

    @Override
    public void setLevel(Level level) {

    }

    @Override
    public File getFile() {
        return null;
    }

    @Override
    public void setFile(File file) {

    }
}
CustomerLogger .java:
package com.xxx;
 
import org.apache.dubbo.common.logger.Logger;
 
public class CustomerLogger implements Logger {


    @Override
    public void trace(String msg) {

    }

    @Override
    public void trace(Throwable e) {

    }

    @Override
    public void trace(String msg, Throwable e) {

    }

    @Override
    public void debug(String msg) {

    }

    @Override
    public void debug(Throwable e) {

    }

    @Override
    public void debug(String msg, Throwable e) {

    }

    @Override
    public void info(String msg) {
        System.out.println("msg:"+msg);
    }

    @Override
    public void info(Throwable e) {

    }

    @Override
    public void info(String msg, Throwable e) {

    }

    @Override
    public void warn(String msg) {

    }

    @Override
    public void warn(Throwable e) {

    }

    @Override
    public void warn(String msg, Throwable e) {

    }

    @Override
    public void error(String msg) {

    }

    @Override
    public void error(Throwable e) {

    }

    @Override
    public void error(String msg, Throwable e) {

    }

    @Override
    public boolean isTraceEnabled() {
        return false;
    }

    @Override
    public boolean isDebugEnabled() {
        return false;
    }

    @Override
    public boolean isInfoEnabled() {
        return false;
    }

    @Override
    public boolean isWarnEnabled() {
        return false;
    }

    @Override
    public boolean isErrorEnabled() {
        return false;
    }

}
customer=com.hyts.assemble.dubbo3.comp.logger.CustomerLoggerAdaptor
-Ddubbo.application.logger=customer

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MATLB|基于matpower优化调度的风力模型预测

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

T6300A 网络综合测试仪 以太网数据 千兆以太网测试仪

一款功能强大、便携式、方便使用、价格便宜的高性价比手持式以太网测试仪是企业中网络管理和维护人员的刚需仪器。好的以太网测试仪可以帮助工作人员迅速解决网络不通、网速慢、丢包、延迟等问题。 当今以太网测试仪市场参差不齐&#xff0c;说的功能一个比一个强&#xff0c;…

【轻松掌握C语言】动态内存管理

目录 一、为什么存在动态内存分配 二、动态内存函数 1、malloc函数 (1)函数的用途 (2)函数的使用 2、free函数 (1)函数的用途 (2)函数的使用 3、calloc函数 (1)函数的用途 (2)函数的使用 4、realloc函数 (1)函数的用途 (2)函数的使用 三、常见的动态内存错误 1、对NULL指针的解…

【小f的刷题笔记】(JS)链表 - 单链表的倒数第 k 个节点 LeetCode19 单链表的中点 LeetCode876

【链表】 一、单链表的倒数第 k 个节点&#xff1a; ✔ 要求&#xff1a;只遍历一遍&#xff0c;链表有多长未知 LeetCode19 链接&#xff1a; 19.删除链表的倒数第N个结点 题目&#xff1a; 思路&#xff1a; 因为没有给头结点&#xff0c;我们就先定义一个哑结点&#…

从对称加密和非对称加密讲解HTTP到HTTPS的发展思路

一、传统的HTTP协议 传统的http在进行网络数据传输时&#xff0c;数据信息都是明文的&#xff0c;因此就很容易出现数据在网络的传输过程&#xff08;中间路由过程&#xff09;数据被监听或者窃取、替换的危险。因此http是一种不安全的传输协议。 那么就需要对数据进行加密。…

网络编程与通信原理

总感觉这个概念&#xff0c;和研发有点脱节&#xff1b; 一、基础概念 不同设备之间通过网络进行数据传输&#xff0c;并且基于通用的网络协议作为多种设备的兼容标准&#xff0c;称为网络通信&#xff1b; 以C/S架构来看&#xff0c;在一次请求当中&#xff0c;客户端和服务端…

物联网开发笔记(59)- 使用Micropython开发ESP32开发板之控制合宙4g Air724U模块

一、目的 这一节我们学习如何使用我们的ESP32开发板来控制合宙4g Air724U模块。 二、环境 ESP32 合宙4g Air724U模块 Thonny IDE 几根杜邦线 接线方法&#xff1a; 注意连接方式&#xff1a; ESP32的RX2----->4G模块的TX ESP32的TX2----->4G模块的RX 三、介绍 1&…

JSP ssh机房学生上机管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP SSH机房学生上机管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采 用B/S模式开发。开发环境为TOMCA…

SpringBoot 注解方式快速整合Mybatis

序言&#xff1a;使用MyBatis3提供的注解可以逐步取代XML&#xff0c;例如使用Select注解直接编写SQL完成数据查询&#xff0c;使用SelectProvider高级注解还可以编写动态SQL&#xff0c;以应对复杂的业务需求。 一. 基础注解 MyBatis 主要提供了以下CRUD注解&#xff1a; Se…

Spring Cloud Alibaba Nacos Config - - - >@RefreshScope动态获取刷新后的配置内容

初学者不知道有没有这个疑惑&#xff1a;我明明已经在 SpringBoot 应用的 bootstrap.yml 配置文件中&#xff0c;通过 spring.cloud.nacos.config.refresh-enabledtrue 开启配置文件动态刷新了&#xff0c;为什么在 Controller 控制类中使用 Value 注解无法获取到配置文件修改后…

猿如意中的【取色器】效率工具详情介绍

目录 一、工具名称 二、下载安装渠道 2.1 什么是猿如意&#xff1f; 2.2 如何下载猿如意&#xff1f; 2.3 如何在猿如意中下载取色器&#xff1f; 三、取色器介绍 四、软件安装过程 五、软件界面 六、取色器功能特点介绍 七、取色器使用/体验感受 一、工具名称…

Typescript学习(第三弹)

泛型 定义 不预先确定的数据类型&#xff0c;具体的类型在使用的时候才确定&#xff0c;把泛型理解为代表类型的参数 泛型函数 泛型函数类型 泛型接口 引用泛型接口要指定一个类型&#xff0c;否则会报错 或者在泛型接口里指定一个默认类型 泛型类 泛型放在类的后面这样…

项目上线后我是如何通过慢查询和索引让系统快起来的

1、前言 最近对mysql的操作比较多一些&#xff0c;主要是项目上线以后&#xff0c;难免会有一些数据上的问题。开始的时候还主要由后端来处理&#xff0c;后面数据问题确实比较多&#xff0c;于是我就找后端要来服务器的账号密码&#xff0c;连上数据库顺便来看看数据的问题。…

C语言小项目-----员工管理系统

目录 项目要求&#xff1a; 考虑点&#xff1a; 实现过程 所用知识点 最终效果如下&#xff1a; 项目要求&#xff1a; 考虑点&#xff1a; 服务器端用select监听多个客户端&#xff0c;考虑点在于&#xff0c;公司内部的系统管理系统&#xff0c;不会有太多人每天都登陆&a…

【web前端开发】CSS的元素显示模式

前言 元素的显示模式可以更好的帮助我们布局页面,了解元素的显示模式,可以让我们布局页面时更加简单清晰 什么是元素显示模式 元素显示模式就是元素(标签)以什么样的方式进行显示 HTML元素一般分为块元素和行内元素两种类型 以下是块级元素和行内元素在网页中的显示: 块元…

3.神经网络-深度学习入门

3.神经网络 深度学习入门 本文的文件和代码链接&#xff1a;github地址 1.激活函数 sigmoid h(x)11e−xh(x) \frac{1}{1 e^{-x}} h(x)1e−x1​ def sigmod(x):return 1 / (1 np.exp(-1 * x))ReLU h(x){x:x>00:x≤0h(x) \left\{ \begin{array}{lr} x & : x > …

CMake静态库和动态库构建实例

任务 建⽴⼀个静态库和动态库&#xff0c;提供 HelloFunc 函数供其他程序编程使⽤&#xff0c;HelloFunc 向终端输出 Hello World 字 符串。安装头⽂件与共享库。 构建过程 构建动态库 目录结构 jyhlinuxubuntu:~/share/makefile_cmake/cmake01$ tree . ├── build #在…

m基于多用户MIMO系统的分布式可重构注水算法的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 在单用户MIMO场景中&#xff0c;空间复用技术能够带来高数据速率的传输&#xff0c;但是也需要一些前提条件&#xff0c;比如发射端的预编码或者接收端的信道估计与信号检测。然而&#xff0c;在…

java项目-第169期ssm二手交易平台网站-ssm毕业设计_计算机毕业设计

java项目-第169期ssm二手交易平台网站-ssm毕业设计 【源码请到下载专栏下载】 《ssm二手交易平台网站》 该项目分为3个角色&#xff0c;管理员、用户、商家。 用户可以浏览前台商品并且进行购买。在个人后台可以看到自己的商品。 商家可以对商品进行商品分类管理、商品信息管理…

React 学习笔记:组件通信

组件通信 组件为什么需要通信呢&#xff1f;这是因为组件是独立且封闭的单元&#xff0c;默认情况下&#xff0c;组件只能使用自己的数据&#xff0c;但是多个组件之间不可避免的要共享某些数据&#xff0c;为了实现这些功能&#xff0c;就需要打破组件的独立封闭性&#xff0…