日志框架适配及运行时管理
本节内容主要是针对于如何在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